1 /* 2 * netlink-types.h Netlink Types (Private) 3 * 4 * This library is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU Lesser General Public 6 * License as published by the Free Software Foundation version 2.1 7 * of the License. 8 * 9 * Copyright (c) 2003-2008 Thomas Graf <tgraf (at) suug.ch> 10 */ 11 12 #ifndef NETLINK_LOCAL_TYPES_H_ 13 #define NETLINK_LOCAL_TYPES_H_ 14 15 #include <netlink/list.h> 16 #include <netlink/route/link.h> 17 #include <netlink/route/qdisc.h> 18 #include <netlink/route/rtnl.h> 19 #include <netlink/route/route.h> 20 #include <netlink/object-api.h> 21 #include <linux/socket.h> 22 #include <linux/pkt_sched.h> 23 24 #define NL_SOCK_BUFSIZE_SET (1<<0) 25 #define NL_SOCK_PASSCRED (1<<1) 26 #define NL_OWN_PORT (1<<2) 27 #define NL_MSG_PEEK (1<<3) 28 #define NL_NO_AUTO_ACK (1<<4) 29 30 #define NL_MSG_CRED_PRESENT 1 31 32 struct nl_cache_ops; 33 struct nl_sock; 34 struct nl_object; 35 36 struct nl_cb 37 { 38 nl_recvmsg_msg_cb_t cb_set[NL_CB_TYPE_MAX+1]; 39 void * cb_args[NL_CB_TYPE_MAX+1]; 40 41 nl_recvmsg_err_cb_t cb_err; 42 void * cb_err_arg; 43 44 /** May be used to replace nl_recvmsgs with your own implementation 45 * in all internal calls to nl_recvmsgs. */ 46 int (*cb_recvmsgs_ow)(struct nl_sock *, 47 struct nl_cb *); 48 49 /** Overwrite internal calls to nl_recv, must return the number of 50 * octets read and allocate a buffer for the received data. */ 51 int (*cb_recv_ow)(struct nl_sock *, 52 struct sockaddr_nl *, 53 unsigned char **, 54 struct ucred **); 55 56 /** Overwrites internal calls to nl_send, must send the netlink 57 * message. */ 58 int (*cb_send_ow)(struct nl_sock *, 59 struct nl_msg *); 60 61 int cb_refcnt; 62 }; 63 64 struct nl_sock 65 { 66 struct sockaddr_nl s_local; 67 struct sockaddr_nl s_peer; 68 int s_fd; 69 int s_proto; 70 unsigned int s_seq_next; 71 unsigned int s_seq_expect; 72 int s_flags; 73 struct nl_cb * s_cb; 74 }; 75 76 struct nl_cache 77 { 78 struct nl_list_head c_items; 79 int c_nitems; 80 int c_iarg1; 81 int c_iarg2; 82 struct nl_cache_ops * c_ops; 83 }; 84 85 struct nl_cache_assoc 86 { 87 struct nl_cache * ca_cache; 88 change_func_t ca_change; 89 void * ca_change_data; 90 }; 91 92 struct nl_cache_mngr 93 { 94 int cm_protocol; 95 int cm_flags; 96 int cm_nassocs; 97 struct nl_sock * cm_handle; 98 struct nl_cache_assoc * cm_assocs; 99 }; 100 101 struct nl_parser_param; 102 103 #define LOOSE_COMPARISON 1 104 105 #define NL_OBJ_MARK 1 106 107 struct nl_object 108 { 109 NLHDR_COMMON 110 }; 111 112 struct nl_data 113 { 114 size_t d_size; 115 void * d_data; 116 }; 117 118 struct nl_addr 119 { 120 int a_family; 121 unsigned int a_maxsize; 122 unsigned int a_len; 123 int a_prefixlen; 124 int a_refcnt; 125 char a_addr[0]; 126 }; 127 128 struct nl_msg 129 { 130 int nm_protocol; 131 int nm_flags; 132 struct sockaddr_nl nm_src; 133 struct sockaddr_nl nm_dst; 134 struct ucred nm_creds; 135 struct nlmsghdr * nm_nlh; 136 size_t nm_size; 137 int nm_refcnt; 138 }; 139 140 struct rtnl_link_map 141 { 142 uint64_t lm_mem_start; 143 uint64_t lm_mem_end; 144 uint64_t lm_base_addr; 145 uint16_t lm_irq; 146 uint8_t lm_dma; 147 uint8_t lm_port; 148 }; 149 150 #define IFQDISCSIZ 32 151 152 struct rtnl_link 153 { 154 NLHDR_COMMON 155 156 char l_name[IFNAMSIZ]; 157 158 uint32_t l_family; 159 uint32_t l_arptype; 160 uint32_t l_index; 161 uint32_t l_flags; 162 uint32_t l_change; 163 uint32_t l_mtu; 164 uint32_t l_link; 165 uint32_t l_txqlen; 166 uint32_t l_weight; 167 uint32_t l_master; 168 struct nl_addr *l_addr; 169 struct nl_addr *l_bcast; 170 char l_qdisc[IFQDISCSIZ]; 171 struct rtnl_link_map l_map; 172 uint64_t l_stats[RTNL_LINK_STATS_MAX+1]; 173 uint32_t l_flag_mask; 174 uint8_t l_operstate; 175 uint8_t l_linkmode; 176 /* 2 byte hole */ 177 struct rtnl_link_info_ops *l_info_ops; 178 void * l_info; 179 }; 180 181 struct rtnl_ncacheinfo 182 { 183 uint32_t nci_confirmed; /**< Time since neighbour validty was last confirmed */ 184 uint32_t nci_used; /**< Time since neighbour entry was last ued */ 185 uint32_t nci_updated; /**< Time since last update */ 186 uint32_t nci_refcnt; /**< Reference counter */ 187 }; 188 189 190 struct rtnl_neigh 191 { 192 NLHDR_COMMON 193 uint32_t n_family; 194 uint32_t n_ifindex; 195 uint16_t n_state; 196 uint8_t n_flags; 197 uint8_t n_type; 198 struct nl_addr *n_lladdr; 199 struct nl_addr *n_dst; 200 uint32_t n_probes; 201 struct rtnl_ncacheinfo n_cacheinfo; 202 uint32_t n_state_mask; 203 uint32_t n_flag_mask; 204 }; 205 206 207 struct rtnl_addr_cacheinfo 208 { 209 /* Preferred lifetime in seconds */ 210 uint32_t aci_prefered; 211 212 /* Valid lifetime in seconds */ 213 uint32_t aci_valid; 214 215 /* Timestamp of creation in 1/100s seince boottime */ 216 uint32_t aci_cstamp; 217 218 /* Timestamp of last update in 1/100s since boottime */ 219 uint32_t aci_tstamp; 220 }; 221 222 struct rtnl_addr 223 { 224 NLHDR_COMMON 225 226 uint8_t a_family; 227 uint8_t a_prefixlen; 228 uint8_t a_flags; 229 uint8_t a_scope; 230 uint32_t a_ifindex; 231 232 struct nl_addr *a_peer; 233 struct nl_addr *a_local; 234 struct nl_addr *a_bcast; 235 struct nl_addr *a_anycast; 236 struct nl_addr *a_multicast; 237 238 struct rtnl_addr_cacheinfo a_cacheinfo; 239 240 char a_label[IFNAMSIZ]; 241 uint32_t a_flag_mask; 242 }; 243 244 struct rtnl_nexthop 245 { 246 uint8_t rtnh_flags; 247 uint8_t rtnh_flag_mask; 248 uint8_t rtnh_weight; 249 /* 1 byte spare */ 250 uint32_t rtnh_ifindex; 251 struct nl_addr * rtnh_gateway; 252 uint32_t ce_mask; /* HACK to support attr macros */ 253 struct nl_list_head rtnh_list; 254 uint32_t rtnh_realms; 255 }; 256 257 struct rtnl_route 258 { 259 NLHDR_COMMON 260 261 uint8_t rt_family; 262 uint8_t rt_dst_len; 263 uint8_t rt_src_len; 264 uint8_t rt_tos; 265 uint8_t rt_protocol; 266 uint8_t rt_scope; 267 uint8_t rt_type; 268 uint8_t rt_nmetrics; 269 uint32_t rt_flags; 270 struct nl_addr * rt_dst; 271 struct nl_addr * rt_src; 272 uint32_t rt_table; 273 uint32_t rt_iif; 274 uint32_t rt_prio; 275 uint32_t rt_metrics[RTAX_MAX]; 276 uint32_t rt_metrics_mask; 277 uint32_t rt_nr_nh; 278 struct nl_addr * rt_pref_src; 279 struct nl_list_head rt_nexthops; 280 struct rtnl_rtcacheinfo rt_cacheinfo; 281 uint32_t rt_flag_mask; 282 }; 283 284 struct rtnl_rule 285 { 286 NLHDR_COMMON 287 288 uint64_t r_mark; 289 uint32_t r_prio; 290 uint32_t r_realms; 291 uint32_t r_table; 292 uint8_t r_dsfield; 293 uint8_t r_type; 294 uint8_t r_family; 295 uint8_t r_src_len; 296 uint8_t r_dst_len; 297 char r_iif[IFNAMSIZ]; 298 struct nl_addr *r_src; 299 struct nl_addr *r_dst; 300 struct nl_addr *r_srcmap; 301 }; 302 303 struct rtnl_neightbl_parms 304 { 305 /** 306 * Interface index of the device this parameter set is assigned 307 * to or 0 for the default set. 308 */ 309 uint32_t ntp_ifindex; 310 311 /** 312 * Number of references to this parameter set. 313 */ 314 uint32_t ntp_refcnt; 315 316 /** 317 * Queue length for pending arp requests, i.e. the number of 318 * packets which are accepted from other layers while the 319 * neighbour address is still being resolved 320 */ 321 uint32_t ntp_queue_len; 322 323 /** 324 * Number of requests to send to the user level ARP daemon. 325 * Specify 0 to disable. 326 */ 327 uint32_t ntp_app_probes; 328 329 /** 330 * Maximum number of retries for unicast solicitation. 331 */ 332 uint32_t ntp_ucast_probes; 333 334 /** 335 * Maximum number of retries for multicast solicitation. 336 */ 337 uint32_t ntp_mcast_probes; 338 339 /** 340 * Base value in milliseconds to ompute reachable time, see RFC2461. 341 */ 342 uint64_t ntp_base_reachable_time; 343 344 /** 345 * Actual reachable time (read-only) 346 */ 347 uint64_t ntp_reachable_time; /* secs */ 348 349 /** 350 * The time in milliseconds between retransmitted Neighbor 351 * Solicitation messages. 352 */ 353 uint64_t ntp_retrans_time; 354 355 /** 356 * Interval in milliseconds to check for stale neighbour 357 * entries. 358 */ 359 uint64_t ntp_gc_stale_time; /* secs */ 360 361 /** 362 * Delay in milliseconds for the first time probe if 363 * the neighbour is reachable. 364 */ 365 uint64_t ntp_probe_delay; /* secs */ 366 367 /** 368 * Maximum delay in milliseconds of an answer to a neighbour 369 * solicitation message. 370 */ 371 uint64_t ntp_anycast_delay; 372 373 /** 374 * Minimum age in milliseconds before a neighbour entry 375 * may be replaced. 376 */ 377 uint64_t ntp_locktime; 378 379 /** 380 * Delay in milliseconds before answering to an ARP request 381 * for which a proxy ARP entry exists. 382 */ 383 uint64_t ntp_proxy_delay; 384 385 /** 386 * Queue length for the delayed proxy arp requests. 387 */ 388 uint32_t ntp_proxy_qlen; 389 390 /** 391 * Mask of available parameter attributes 392 */ 393 uint32_t ntp_mask; 394 }; 395 396 #define NTBLNAMSIZ 32 397 398 /** 399 * Neighbour table 400 * @ingroup neightbl 401 */ 402 struct rtnl_neightbl 403 { 404 NLHDR_COMMON 405 406 char nt_name[NTBLNAMSIZ]; 407 uint32_t nt_family; 408 uint32_t nt_gc_thresh1; 409 uint32_t nt_gc_thresh2; 410 uint32_t nt_gc_thresh3; 411 uint64_t nt_gc_interval; 412 struct ndt_config nt_config; 413 struct rtnl_neightbl_parms nt_parms; 414 struct ndt_stats nt_stats; 415 }; 416 417 struct rtnl_ratespec 418 { 419 uint8_t rs_cell_log; 420 uint16_t rs_feature; 421 uint16_t rs_addend; 422 uint16_t rs_mpu; 423 uint32_t rs_rate; 424 }; 425 426 struct rtnl_tstats 427 { 428 struct { 429 uint64_t bytes; 430 uint64_t packets; 431 } tcs_basic; 432 433 struct { 434 uint32_t bps; 435 uint32_t pps; 436 } tcs_rate_est; 437 438 struct { 439 uint32_t qlen; 440 uint32_t backlog; 441 uint32_t drops; 442 uint32_t requeues; 443 uint32_t overlimits; 444 } tcs_queue; 445 }; 446 447 #define TCKINDSIZ 32 448 449 #define NL_TCA_GENERIC(pre) \ 450 NLHDR_COMMON \ 451 uint32_t pre ##_family; \ 452 uint32_t pre ##_ifindex; \ 453 uint32_t pre ##_handle; \ 454 uint32_t pre ##_parent; \ 455 uint32_t pre ##_info; \ 456 char pre ##_kind[TCKINDSIZ]; \ 457 struct nl_data * pre ##_opts; \ 458 uint64_t pre ##_stats[RTNL_TC_STATS_MAX+1]; \ 459 struct nl_data * pre ##_xstats; \ 460 struct nl_data * pre ##_subdata; \ 461 462 463 struct rtnl_tca 464 { 465 NL_TCA_GENERIC(tc); 466 }; 467 468 struct rtnl_qdisc 469 { 470 NL_TCA_GENERIC(q); 471 struct rtnl_qdisc_ops *q_ops; 472 }; 473 474 struct rtnl_class 475 { 476 NL_TCA_GENERIC(c); 477 struct rtnl_class_ops *c_ops; 478 }; 479 480 struct rtnl_cls 481 { 482 NL_TCA_GENERIC(c); 483 uint16_t c_prio; 484 uint16_t c_protocol; 485 struct rtnl_cls_ops *c_ops; 486 }; 487 488 struct rtnl_u32 489 { 490 uint32_t cu_divisor; 491 uint32_t cu_hash; 492 uint32_t cu_classid; 493 uint32_t cu_link; 494 struct nl_data * cu_pcnt; 495 struct nl_data * cu_selector; 496 struct nl_data * cu_act; 497 struct nl_data * cu_police; 498 char cu_indev[IFNAMSIZ]; 499 int cu_mask; 500 }; 501 502 struct rtnl_cgroup 503 { 504 struct rtnl_ematch_tree *cg_ematch; 505 int cg_mask; 506 }; 507 508 struct rtnl_fw 509 { 510 uint32_t cf_classid; 511 struct nl_data * cf_act; 512 struct nl_data * cf_police; 513 char cf_indev[IFNAMSIZ]; 514 int cf_mask; 515 }; 516 517 struct rtnl_ematch 518 { 519 uint16_t e_id; 520 uint16_t e_kind; 521 uint16_t e_flags; 522 523 struct nl_list_head e_childs; 524 struct nl_list_head e_list; 525 struct rtnl_ematch_ops *e_ops; 526 527 char e_data[0]; 528 }; 529 530 struct rtnl_ematch_tree 531 { 532 uint16_t et_progid; 533 struct nl_list_head et_list; 534 535 }; 536 537 struct rtnl_dsmark_qdisc 538 { 539 uint16_t qdm_indices; 540 uint16_t qdm_default_index; 541 uint32_t qdm_set_tc_index; 542 uint32_t qdm_mask; 543 }; 544 545 struct rtnl_dsmark_class 546 { 547 uint8_t cdm_bmask; 548 uint8_t cdm_value; 549 uint32_t cdm_mask; 550 }; 551 552 struct rtnl_fifo 553 { 554 uint32_t qf_limit; 555 uint32_t qf_mask; 556 }; 557 558 struct rtnl_prio 559 { 560 uint32_t qp_bands; 561 uint8_t qp_priomap[TC_PRIO_MAX+1]; 562 uint32_t qp_mask; 563 }; 564 565 struct rtnl_tbf 566 { 567 uint32_t qt_limit; 568 uint32_t qt_mpu; 569 struct rtnl_ratespec qt_rate; 570 uint32_t qt_rate_bucket; 571 uint32_t qt_rate_txtime; 572 struct rtnl_ratespec qt_peakrate; 573 uint32_t qt_peakrate_bucket; 574 uint32_t qt_peakrate_txtime; 575 uint32_t qt_mask; 576 }; 577 578 struct rtnl_sfq 579 { 580 uint32_t qs_quantum; 581 uint32_t qs_perturb; 582 uint32_t qs_limit; 583 uint32_t qs_divisor; 584 uint32_t qs_flows; 585 uint32_t qs_mask; 586 }; 587 588 struct rtnl_netem_corr 589 { 590 uint32_t nmc_delay; 591 uint32_t nmc_loss; 592 uint32_t nmc_duplicate; 593 }; 594 595 struct rtnl_netem_reo 596 { 597 uint32_t nmro_probability; 598 uint32_t nmro_correlation; 599 }; 600 601 struct rtnl_netem_crpt 602 { 603 uint32_t nmcr_probability; 604 uint32_t nmcr_correlation; 605 }; 606 607 struct rtnl_netem_dist 608 { 609 int16_t * dist_data; 610 size_t dist_size; 611 }; 612 613 struct rtnl_netem 614 { 615 uint32_t qnm_latency; 616 uint32_t qnm_limit; 617 uint32_t qnm_loss; 618 uint32_t qnm_gap; 619 uint32_t qnm_duplicate; 620 uint32_t qnm_jitter; 621 uint32_t qnm_mask; 622 struct rtnl_netem_corr qnm_corr; 623 struct rtnl_netem_reo qnm_ro; 624 struct rtnl_netem_crpt qnm_crpt; 625 struct rtnl_netem_dist qnm_dist; 626 }; 627 628 struct rtnl_htb_qdisc 629 { 630 uint32_t qh_rate2quantum; 631 uint32_t qh_defcls; 632 uint32_t qh_mask; 633 }; 634 635 struct rtnl_htb_class 636 { 637 uint32_t ch_prio; 638 uint32_t ch_mtu; 639 struct rtnl_ratespec ch_rate; 640 struct rtnl_ratespec ch_ceil; 641 uint32_t ch_rbuffer; 642 uint32_t ch_cbuffer; 643 uint32_t ch_quantum; 644 uint8_t ch_overhead; 645 uint8_t ch_mpu; 646 uint32_t ch_mask; 647 }; 648 649 struct rtnl_cbq 650 { 651 struct tc_cbq_lssopt cbq_lss; 652 struct tc_ratespec cbq_rate; 653 struct tc_cbq_wrropt cbq_wrr; 654 struct tc_cbq_ovl cbq_ovl; 655 struct tc_cbq_fopt cbq_fopt; 656 struct tc_cbq_police cbq_police; 657 }; 658 659 struct rtnl_red 660 { 661 uint32_t qr_limit; 662 uint32_t qr_qth_min; 663 uint32_t qr_qth_max; 664 uint8_t qr_flags; 665 uint8_t qr_wlog; 666 uint8_t qr_plog; 667 uint8_t qr_scell_log; 668 uint32_t qr_mask; 669 }; 670 671 struct flnl_request 672 { 673 NLHDR_COMMON 674 675 struct nl_addr * lr_addr; 676 uint32_t lr_fwmark; 677 uint8_t lr_tos; 678 uint8_t lr_scope; 679 uint8_t lr_table; 680 }; 681 682 683 struct flnl_result 684 { 685 NLHDR_COMMON 686 687 struct flnl_request * fr_req; 688 uint8_t fr_table_id; 689 uint8_t fr_prefixlen; 690 uint8_t fr_nh_sel; 691 uint8_t fr_type; 692 uint8_t fr_scope; 693 uint32_t fr_error; 694 }; 695 696 #define GENL_OP_HAS_POLICY 1 697 #define GENL_OP_HAS_DOIT 2 698 #define GENL_OP_HAS_DUMPIT 4 699 700 struct genl_family_op 701 { 702 uint32_t o_id; 703 uint32_t o_flags; 704 705 struct nl_list_head o_list; 706 }; 707 708 struct genl_family 709 { 710 NLHDR_COMMON 711 712 uint16_t gf_id; 713 char gf_name[GENL_NAMSIZ]; 714 uint32_t gf_version; 715 uint32_t gf_hdrsize; 716 uint32_t gf_maxattr; 717 718 struct nl_list_head gf_ops; 719 }; 720 721 union nfnl_ct_proto 722 { 723 struct { 724 uint16_t src; 725 uint16_t dst; 726 } port; 727 struct { 728 uint16_t id; 729 uint8_t type; 730 uint8_t code; 731 } icmp; 732 }; 733 734 struct nfnl_ct_dir { 735 struct nl_addr * src; 736 struct nl_addr * dst; 737 union nfnl_ct_proto proto; 738 uint64_t packets; 739 uint64_t bytes; 740 }; 741 742 union nfnl_ct_protoinfo { 743 struct { 744 uint8_t state; 745 } tcp; 746 }; 747 748 struct nfnl_ct { 749 NLHDR_COMMON 750 751 uint8_t ct_family; 752 uint8_t ct_proto; 753 union nfnl_ct_protoinfo ct_protoinfo; 754 755 uint32_t ct_status; 756 uint32_t ct_status_mask; 757 uint32_t ct_timeout; 758 uint32_t ct_mark; 759 uint32_t ct_use; 760 uint32_t ct_id; 761 762 struct nfnl_ct_dir ct_orig; 763 struct nfnl_ct_dir ct_repl; 764 }; 765 766 struct nfnl_log { 767 NLHDR_COMMON 768 769 uint16_t log_group; 770 uint8_t log_copy_mode; 771 uint32_t log_copy_range; 772 uint32_t log_flush_timeout; 773 uint32_t log_alloc_size; 774 uint32_t log_queue_threshold; 775 uint32_t log_flags; 776 uint32_t log_flag_mask; 777 }; 778 779 struct nfnl_log_msg { 780 NLHDR_COMMON 781 782 uint8_t log_msg_family; 783 uint8_t log_msg_hook; 784 uint16_t log_msg_hwproto; 785 uint32_t log_msg_mark; 786 struct timeval log_msg_timestamp; 787 uint32_t log_msg_indev; 788 uint32_t log_msg_outdev; 789 uint32_t log_msg_physindev; 790 uint32_t log_msg_physoutdev; 791 uint8_t log_msg_hwaddr[8]; 792 int log_msg_hwaddr_len; 793 void * log_msg_payload; 794 int log_msg_payload_len; 795 char * log_msg_prefix; 796 uint32_t log_msg_uid; 797 uint32_t log_msg_gid; 798 uint32_t log_msg_seq; 799 uint32_t log_msg_seq_global; 800 }; 801 802 struct nfnl_queue { 803 NLHDR_COMMON 804 805 uint16_t queue_group; 806 uint32_t queue_maxlen; 807 uint32_t queue_copy_range; 808 uint8_t queue_copy_mode; 809 }; 810 811 struct nfnl_queue_msg { 812 NLHDR_COMMON 813 814 uint16_t queue_msg_group; 815 uint8_t queue_msg_family; 816 uint8_t queue_msg_hook; 817 uint16_t queue_msg_hwproto; 818 uint32_t queue_msg_packetid; 819 uint32_t queue_msg_mark; 820 struct timeval queue_msg_timestamp; 821 uint32_t queue_msg_indev; 822 uint32_t queue_msg_outdev; 823 uint32_t queue_msg_physindev; 824 uint32_t queue_msg_physoutdev; 825 uint8_t queue_msg_hwaddr[8]; 826 int queue_msg_hwaddr_len; 827 void * queue_msg_payload; 828 int queue_msg_payload_len; 829 uint32_t queue_msg_verdict; 830 }; 831 832 #endif 833