1054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart/*
2054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart * tests/check-attr.c		nla_attr unit tests
3054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart *
4054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart *	This library is free software; you can redistribute it and/or
5054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart *	modify it under the terms of the GNU Lesser General Public
6054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart *	License as published by the Free Software Foundation version 2.1
7054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart *	of the License.
8054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart *
9054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart * Copyright (c) 2013 Thomas Graf <tgraf@suug.ch>
10054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart */
11054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart
12054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart#include "util.h"
13054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart#include <netlink/attr.h>
14054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart#include <netlink/msg.h>
15054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart
16054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul StewartSTART_TEST(attr_size)
17054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart{
18054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	fail_if(nla_attr_size(0) != NLA_HDRLEN,
19054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart		"Length of empty attribute should match header size");
20054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	fail_if(nla_attr_size(1) != NLA_HDRLEN + 1,
21054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	        "Length of 1 bytes payload should be NLA_HDRLEN + 1");
22054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	fail_if(nla_attr_size(2) != NLA_HDRLEN + 2,
23054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	        "Length of 2 bytes payload should be NLA_HDRLEN + 2");
24054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	fail_if(nla_attr_size(3) != NLA_HDRLEN + 3,
25054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	        "Length of 3 bytes payload should be NLA_HDRLEN + 3");
26054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	fail_if(nla_attr_size(4) != NLA_HDRLEN + 4,
27054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	        "Length of 4 bytes payload should be NLA_HDRLEN + 4");
28054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart
29054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	fail_if(nla_total_size(1) != NLA_HDRLEN + 4,
30054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart		"Total size of 1 bytes payload should result in 8 bytes");
31054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	fail_if(nla_total_size(2) != NLA_HDRLEN + 4,
32054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart		"Total size of 2 bytes payload should result in 8 bytes");
33054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	fail_if(nla_total_size(3) != NLA_HDRLEN + 4,
34054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart		"Total size of 3 bytes payload should result in 8 bytes");
35054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	fail_if(nla_total_size(4) != NLA_HDRLEN + 4,
36054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart		"Total size of 4 bytes payload should result in 8 bytes");
37054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart
38054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	fail_if(nla_padlen(1) != 3,
39054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart		"2 bytes of payload should result in 3 padding bytes");
40054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	fail_if(nla_padlen(2) != 2,
41054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart		"2 bytes of payload should result in 2 padding bytes");
42054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	fail_if(nla_padlen(3) != 1,
43054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart		"3 bytes of payload should result in 1 padding bytes");
44054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	fail_if(nla_padlen(4) != 0,
45054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart		"4 bytes of payload should result in 0 padding bytes");
46054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	fail_if(nla_padlen(5) != 3,
47054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart		"5 bytes of payload should result in 3 padding bytes");
48054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart}
49054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul StewartEND_TEST
50054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart
51054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul StewartSTART_TEST(msg_construct)
52054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart{
53054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	struct nl_msg *msg;
54054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	struct nlmsghdr *nlh;
55054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	struct nlattr *a;
56054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	int i, rem;
57054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart
58054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	msg = nlmsg_alloc();
59054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	fail_if(!msg, "Unable to allocate netlink message");
60054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart
61054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	for (i = 1; i < 256; i++) {
62054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart		fail_if(nla_put_u32(msg, i, i+1) != 0,
63054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart			"Unable to add attribute %d", i);
64054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	}
65054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart
66054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	nlh = nlmsg_hdr(msg);
67054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	i = 1;
68054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	nlmsg_for_each_attr(a, nlh, 0, rem) {
69054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart		fail_if(nla_type(a) != i, "Expected attribute %d", i);
70054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart		i++;
71054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart		fail_if(nla_get_u32(a) != i, "Expected attribute value %d", i);
72054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	}
73054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart
74054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	nlmsg_free(msg);
75054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart}
76054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul StewartEND_TEST
77054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart
78054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul StewartSuite *make_nl_attr_suite(void)
79054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart{
80054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	Suite *suite = suite_create("Netlink attributes");
81054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart
82054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	TCase *nl_attr = tcase_create("Core");
83054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	tcase_add_test(nl_attr, attr_size);
84054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	tcase_add_test(nl_attr, msg_construct);
85054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	suite_add_tcase(suite, nl_attr);
86054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart
87054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	return suite;
88054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart}
89