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