def test_ints(): """Test integer attributes.""" msg = nlmsg_alloc() assert 0 == libnl.attr.nla_put_u8(msg, 2, 10) assert 0 == libnl.attr.nla_put_u16(msg, 3, 11) assert 0 == libnl.attr.nla_put_u32(msg, 4, 12) assert 0 == libnl.attr.nla_put_u64(msg, 5, 13195) attr = nlmsg_find_attr(nlmsg_hdr(msg), 0, 2) assert 2 == libnl.attr.nla_type(attr) assert 10 == libnl.attr.nla_get_u8(attr) assert 5 == attr.nla_len assert b"BQACAAo=" == base64.b64encode(buffer(attr.bytearray[: attr.nla_len])) attr = nlmsg_find_attr(nlmsg_hdr(msg), 0, 3) assert 3 == libnl.attr.nla_type(attr) assert 11 == libnl.attr.nla_get_u16(attr) assert 6 == attr.nla_len assert b"BgADAAsA" == base64.b64encode(buffer(attr.bytearray[: attr.nla_len])) attr = nlmsg_find_attr(nlmsg_hdr(msg), 0, 4) assert 4 == libnl.attr.nla_type(attr) assert 12 == libnl.attr.nla_get_u32(attr) assert 8 == attr.nla_len assert b"CAAEAAwAAAA=" == base64.b64encode(buffer(attr.bytearray[: attr.nla_len])) attr = nlmsg_find_attr(nlmsg_hdr(msg), 0, 5) assert 5 == libnl.attr.nla_type(attr) assert 13195 == libnl.attr.nla_get_u64(attr) # printf("%llu\n", nla_get_u64(attr)); assert 12 == attr.nla_len assert b"DAAFAIszAAAAAAAA" == base64.b64encode(buffer(attr.bytearray[: attr.nla_len]))
def test_msecs(): """Test milliseconds.""" msg = nlmsg_alloc() assert 0 == libnl.attr.nla_put_msecs(msg, 12, 99) attr = nlmsg_find_attr(nlmsg_hdr(msg), 0, 12) assert 12 == libnl.attr.nla_type(attr) assert 99 == libnl.attr.nla_get_msecs(attr) assert 12 == attr.nla_len assert b"DAAMAGMAAAAAAAAA" == base64.b64encode(buffer(attr.bytearray[: attr.nla_len]))
def test_flag(): """Test flags.""" msg = nlmsg_alloc() assert 0 == libnl.attr.nla_put_flag(msg, 7) attr = nlmsg_find_attr(nlmsg_hdr(msg), 0, 7) assert 7 == libnl.attr.nla_type(attr) assert libnl.attr.nla_get_flag(attr) is True # printf("%s\n", nla_get_flag(attr) ? "True" : "False"); assert 4 == attr.nla_len assert b"BAAHAA==" == base64.b64encode(buffer(attr.bytearray[: attr.nla_len]))
def test_msecs(): """Test milliseconds.""" msg = nlmsg_alloc() assert 0 == libnl.attr.nla_put_msecs(msg, 12, 99) attr = nlmsg_find_attr(nlmsg_hdr(msg), 0, 12) assert 12 == libnl.attr.nla_type(attr) assert 99 == libnl.attr.nla_get_msecs(attr) assert 12 == attr.nla_len assert b'DAAMAGMAAAAAAAAA' == base64.b64encode( buffer(attr.bytearray[:attr.nla_len]))
def test_string_short(): """Test string attributes with a short string.""" payload = bytes("test".encode("ascii")) msg = nlmsg_alloc() assert 0 == libnl.attr.nla_put_string(msg, 6, payload) attr = nlmsg_find_attr(nlmsg_hdr(msg), 0, 6) assert 6 == libnl.attr.nla_type(attr) assert payload == libnl.attr.nla_get_string(attr) assert 9 == attr.nla_len assert b"CQAGAHRlc3QA" == base64.b64encode(buffer(attr.bytearray[: attr.nla_len]))
def test_string_short(): """Test string attributes with a short string.""" payload = bytes('test'.encode('ascii')) msg = nlmsg_alloc() assert 0 == libnl.attr.nla_put_string(msg, 6, payload) attr = nlmsg_find_attr(nlmsg_hdr(msg), 0, 6) assert 6 == libnl.attr.nla_type(attr) assert payload == libnl.attr.nla_get_string(attr) assert 9 == attr.nla_len assert b'CQAGAHRlc3QA' == base64.b64encode( buffer(attr.bytearray[:attr.nla_len]))
def test_flag(): """Test flags.""" msg = nlmsg_alloc() assert 0 == libnl.attr.nla_put_flag(msg, 7) attr = nlmsg_find_attr(nlmsg_hdr(msg), 0, 7) assert 7 == libnl.attr.nla_type(attr) assert libnl.attr.nla_get_flag( attr) is True # printf("%s\n", nla_get_flag(attr) ? "True" : "False"); assert 4 == attr.nla_len assert b'BAAHAA==' == base64.b64encode( buffer(attr.bytearray[:attr.nla_len]))
def test_string_medium(): """Test string attributes with a longer string.""" payload = bytes("The quick br()wn f0x jumps over the l@zy dog!".encode("ascii")) msg = nlmsg_alloc() assert 0 == libnl.attr.nla_put_string(msg, 6, payload) attr = nlmsg_find_attr(nlmsg_hdr(msg), 0, 6) assert 6 == libnl.attr.nla_type(attr) assert payload == libnl.attr.nla_get_string(attr) assert 50 == attr.nla_len expected = b"MgAGAFRoZSBxdWljayBicigpd24gZjB4IGp1bXBzIG92ZXIgdGhlIGxAenkgZG9nIQA=" assert expected == base64.b64encode(buffer(attr.bytearray[: attr.nla_len]))
def test_string_medium(): """Test string attributes with a longer string.""" payload = bytes( 'The quick br()wn f0x jumps over the l@zy dog!'.encode('ascii')) msg = nlmsg_alloc() assert 0 == libnl.attr.nla_put_string(msg, 6, payload) attr = nlmsg_find_attr(nlmsg_hdr(msg), 0, 6) assert 6 == libnl.attr.nla_type(attr) assert payload == libnl.attr.nla_get_string(attr) assert 50 == attr.nla_len expected = b'MgAGAFRoZSBxdWljayBicigpd24gZjB4IGp1bXBzIG92ZXIgdGhlIGxAenkgZG9nIQA=' assert expected == base64.b64encode(buffer(attr.bytearray[:attr.nla_len]))
def test_string_long(): """Test string attributes with a long string.""" payload = bytes(string.printable[:-2].encode('ascii')) msg = nlmsg_alloc() assert 0 == libnl.attr.nla_put_string(msg, 6, payload) attr = nlmsg_find_attr(nlmsg_hdr(msg), 0, 6) assert 6 == libnl.attr.nla_type(attr) assert payload == libnl.attr.nla_get_string(attr) assert 103 == attr.nla_len expected = ( b'ZwAGADAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaISIjJCUmJygp' b'KissLS4vOjs8PT4/QFtcXV5fYHt8fX4gCQoNAA==') assert expected == base64.b64encode(buffer(attr.bytearray[:attr.nla_len]))
def test_ints(): """Test integer attributes.""" msg = nlmsg_alloc() assert 0 == libnl.attr.nla_put_u8(msg, 2, 10) assert 0 == libnl.attr.nla_put_u16(msg, 3, 11) assert 0 == libnl.attr.nla_put_u32(msg, 4, 12) assert 0 == libnl.attr.nla_put_u64(msg, 5, 13195) attr = nlmsg_find_attr(nlmsg_hdr(msg), 0, 2) assert 2 == libnl.attr.nla_type(attr) assert 10 == libnl.attr.nla_get_u8(attr) assert 5 == attr.nla_len assert b'BQACAAo=' == base64.b64encode( buffer(attr.bytearray[:attr.nla_len])) attr = nlmsg_find_attr(nlmsg_hdr(msg), 0, 3) assert 3 == libnl.attr.nla_type(attr) assert 11 == libnl.attr.nla_get_u16(attr) assert 6 == attr.nla_len assert b'BgADAAsA' == base64.b64encode( buffer(attr.bytearray[:attr.nla_len])) attr = nlmsg_find_attr(nlmsg_hdr(msg), 0, 4) assert 4 == libnl.attr.nla_type(attr) assert 12 == libnl.attr.nla_get_u32(attr) assert 8 == attr.nla_len assert b'CAAEAAwAAAA=' == base64.b64encode( buffer(attr.bytearray[:attr.nla_len])) attr = nlmsg_find_attr(nlmsg_hdr(msg), 0, 5) assert 5 == libnl.attr.nla_type(attr) assert 13195 == libnl.attr.nla_get_u64( attr) # printf("%llu\n", nla_get_u64(attr)); assert 12 == attr.nla_len assert b'DAAFAIszAAAAAAAA' == base64.b64encode( buffer(attr.bytearray[:attr.nla_len]))
def test_string_long(): """Test string attributes with a long string.""" payload = bytes(string.printable[:-2].encode("ascii")) msg = nlmsg_alloc() assert 0 == libnl.attr.nla_put_string(msg, 6, payload) attr = nlmsg_find_attr(nlmsg_hdr(msg), 0, 6) assert 6 == libnl.attr.nla_type(attr) assert payload == libnl.attr.nla_get_string(attr) assert 103 == attr.nla_len expected = ( b"ZwAGADAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaISIjJCUmJygp" b"KissLS4vOjs8PT4/QFtcXV5fYHt8fX4gCQoNAA==" ) assert expected == base64.b64encode(buffer(attr.bytearray[: attr.nla_len]))
def test_socket(tcp_server): r"""C code to test against. // gcc a.c $(pkg-config --cflags --libs libnl-genl-3.0) && (nc -l 2000 |base64 &) && sleep 0.1 && ./a.out #include <netlink/msg.h> struct nl_sock { struct sockaddr_nl s_local; struct sockaddr_nl s_peer; int s_fd; int s_proto; unsigned int s_seq_next; unsigned int s_seq_expect; int s_flags; struct nl_cb *s_cb; size_t s_bufsize; }; int main() { struct nl_msg *msg = nlmsg_alloc(); printf("%d == nla_put_u32()\n", nla_put_u32(msg, 4, 8)); struct nlmsghdr *nlh = nlmsg_hdr(msg); struct nlattr *attr = nlmsg_find_attr(nlh, 0, 4); printf("%d == nla_type(attr)\n", nla_type(attr)); printf("%d == nla_get_u32(attr)\n", nla_get_u32(attr)); printf("%d == attr->nla_len\n", attr->nla_len); struct sockaddr_in sin = { .sin_port = htons(2000), .sin_family = AF_INET, }; sin.sin_addr.s_addr = inet_addr("127.0.0.1"); int fd = socket(AF_INET, SOCK_STREAM, 0); connect(fd, (struct sockaddr *) &sin, sizeof(sin)); struct nl_sock *sk = nl_socket_alloc(); nl_connect(sk, NETLINK_ROUTE); sk->s_fd = fd; sk->s_local.nl_pid = 0; nl_complete_msg(sk, msg); struct iovec iov = { .iov_base = attr, .iov_len = attr->nla_len }; struct msghdr hdr = { .msg_iov = &iov, .msg_iovlen = 1, }; int ret = nl_sendmsg(sk, msg, &hdr); printf("Bytes: %d\n", ret); // 14 return 0; } // Expected bash output: // 0 == nla_put_u32() // 4 == nla_type(attr) // 8 == nla_get_u32(attr) // 8 == attr->nla_len // Bytes: 8 // CAAEAAgAAAA= """ msg = nlmsg_alloc() assert 0 == libnl.attr.nla_put_u32(msg, 4, 8) nlh = nlmsg_hdr(msg) attr = nlmsg_find_attr(nlh, 0, 4) assert 4 == libnl.attr.nla_type(attr) assert 8 == libnl.attr.nla_get_u32(attr) assert 8 == attr.nla_len sk = nl_socket_alloc() nl_connect(sk, NETLINK_ROUTE) sk.socket_instance.close() sk.socket_instance = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sk.socket_instance.connect(tcp_server.server.server_address) sk.s_local.nl_pid = 0 nl_complete_msg(sk, msg) iov = attr.bytearray[:attr.nla_len] hdr = msghdr(msg_iov=iov) assert 8 == nl_sendmsg(sk, msg, hdr) assert 1 == len(tcp_server.data) assert b'CAAEAAgAAAA=' == base64.b64encode(buffer(iov)) assert b'CAAEAAgAAAA=' == base64.b64encode(buffer(tcp_server.data[0])) nl_socket_free(sk)
def test_socket(tcp_server): r"""C code to test against. // gcc a.c $(pkg-config --cflags --libs libnl-genl-3.0) && (nc -l 2000 |base64 &) && sleep 0.1 && ./a.out #include <netlink/msg.h> struct nl_sock { struct sockaddr_nl s_local; struct sockaddr_nl s_peer; int s_fd; int s_proto; unsigned int s_seq_next; unsigned int s_seq_expect; int s_flags; struct nl_cb *s_cb; size_t s_bufsize; }; int main() { struct nl_msg *msg = nlmsg_alloc(); printf("%d == nla_put_u32()\n", nla_put_u32(msg, 4, 8)); struct nlmsghdr *nlh = nlmsg_hdr(msg); struct nlattr *attr = nlmsg_find_attr(nlh, 0, 4); printf("%d == nla_type(attr)\n", nla_type(attr)); printf("%d == nla_get_u32(attr)\n", nla_get_u32(attr)); printf("%d == attr->nla_len\n", attr->nla_len); struct sockaddr_in sin = { .sin_port = htons(2000), .sin_family = AF_INET, }; sin.sin_addr.s_addr = inet_addr("127.0.0.1"); int fd = socket(AF_INET, SOCK_STREAM, 0); connect(fd, (struct sockaddr *) &sin, sizeof(sin)); struct nl_sock *sk = nl_socket_alloc(); nl_connect(sk, NETLINK_ROUTE); sk->s_fd = fd; sk->s_local.nl_pid = 0; nl_complete_msg(sk, msg); struct iovec iov = { .iov_base = attr, .iov_len = attr->nla_len }; struct msghdr hdr = { .msg_iov = &iov, .msg_iovlen = 1, }; int ret = nl_sendmsg(sk, msg, &hdr); printf("Bytes: %d\n", ret); // 14 return 0; } // Expected bash output: // 0 == nla_put_u32() // 4 == nla_type(attr) // 8 == nla_get_u32(attr) // 8 == attr->nla_len // Bytes: 8 // CAAEAAgAAAA= """ msg = nlmsg_alloc() assert 0 == libnl.attr.nla_put_u32(msg, 4, 8) nlh = nlmsg_hdr(msg) attr = nlmsg_find_attr(nlh, 0, 4) assert 4 == libnl.attr.nla_type(attr) assert 8 == libnl.attr.nla_get_u32(attr) assert 8 == attr.nla_len sk = nl_socket_alloc() nl_connect(sk, NETLINK_ROUTE) sk.socket_instance.close() sk.socket_instance = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sk.socket_instance.connect(tcp_server.server.server_address) sk.s_local.nl_pid = 0 nl_complete_msg(sk, msg) iov = attr.bytearray[: attr.nla_len] hdr = msghdr(msg_iov=iov) assert 8 == nl_sendmsg(sk, msg, hdr) assert 1 == len(tcp_server.data) assert b"CAAEAAgAAAA=" == base64.b64encode(buffer(iov)) assert b"CAAEAAgAAAA=" == base64.b64encode(buffer(tcp_server.data[0])) nl_socket_free(sk)