diff options
Diffstat (limited to 'include/linux/rtnetlink.h')
| -rw-r--r-- | include/linux/rtnetlink.h | 176 |
1 files changed, 176 insertions, 0 deletions
diff --git a/include/linux/rtnetlink.h b/include/linux/rtnetlink.h index 91ac97c20777..e68dbf0bf579 100644 --- a/include/linux/rtnetlink.h +++ b/include/linux/rtnetlink.h | |||
| @@ -89,6 +89,13 @@ enum { | |||
| 89 | RTM_GETANYCAST = 62, | 89 | RTM_GETANYCAST = 62, |
| 90 | #define RTM_GETANYCAST RTM_GETANYCAST | 90 | #define RTM_GETANYCAST RTM_GETANYCAST |
| 91 | 91 | ||
| 92 | RTM_NEWNEIGHTBL = 64, | ||
| 93 | #define RTM_NEWNEIGHTBL RTM_NEWNEIGHTBL | ||
| 94 | RTM_GETNEIGHTBL = 66, | ||
| 95 | #define RTM_GETNEIGHTBL RTM_GETNEIGHTBL | ||
| 96 | RTM_SETNEIGHTBL, | ||
| 97 | #define RTM_SETNEIGHTBL RTM_SETNEIGHTBL | ||
| 98 | |||
| 92 | __RTM_MAX, | 99 | __RTM_MAX, |
| 93 | #define RTM_MAX (((__RTM_MAX + 3) & ~3) - 1) | 100 | #define RTM_MAX (((__RTM_MAX + 3) & ~3) - 1) |
| 94 | }; | 101 | }; |
| @@ -493,6 +500,106 @@ struct nda_cacheinfo | |||
| 493 | __u32 ndm_refcnt; | 500 | __u32 ndm_refcnt; |
| 494 | }; | 501 | }; |
| 495 | 502 | ||
| 503 | |||
| 504 | /***************************************************************** | ||
| 505 | * Neighbour tables specific messages. | ||
| 506 | * | ||
| 507 | * To retrieve the neighbour tables send RTM_GETNEIGHTBL with the | ||
| 508 | * NLM_F_DUMP flag set. Every neighbour table configuration is | ||
| 509 | * spread over multiple messages to avoid running into message | ||
| 510 | * size limits on systems with many interfaces. The first message | ||
| 511 | * in the sequence transports all not device specific data such as | ||
| 512 | * statistics, configuration, and the default parameter set. | ||
| 513 | * This message is followed by 0..n messages carrying device | ||
| 514 | * specific parameter sets. | ||
| 515 | * Although the ordering should be sufficient, NDTA_NAME can be | ||
| 516 | * used to identify sequences. The initial message can be identified | ||
| 517 | * by checking for NDTA_CONFIG. The device specific messages do | ||
| 518 | * not contain this TLV but have NDTPA_IFINDEX set to the | ||
| 519 | * corresponding interface index. | ||
| 520 | * | ||
| 521 | * To change neighbour table attributes, send RTM_SETNEIGHTBL | ||
| 522 | * with NDTA_NAME set. Changeable attribute include NDTA_THRESH[1-3], | ||
| 523 | * NDTA_GC_INTERVAL, and all TLVs in NDTA_PARMS unless marked | ||
| 524 | * otherwise. Device specific parameter sets can be changed by | ||
| 525 | * setting NDTPA_IFINDEX to the interface index of the corresponding | ||
| 526 | * device. | ||
| 527 | ****/ | ||
| 528 | |||
| 529 | struct ndt_stats | ||
| 530 | { | ||
| 531 | __u64 ndts_allocs; | ||
| 532 | __u64 ndts_destroys; | ||
| 533 | __u64 ndts_hash_grows; | ||
| 534 | __u64 ndts_res_failed; | ||
| 535 | __u64 ndts_lookups; | ||
| 536 | __u64 ndts_hits; | ||
| 537 | __u64 ndts_rcv_probes_mcast; | ||
| 538 | __u64 ndts_rcv_probes_ucast; | ||
| 539 | __u64 ndts_periodic_gc_runs; | ||
| 540 | __u64 ndts_forced_gc_runs; | ||
| 541 | }; | ||
| 542 | |||
| 543 | enum { | ||
| 544 | NDTPA_UNSPEC, | ||
| 545 | NDTPA_IFINDEX, /* u32, unchangeable */ | ||
| 546 | NDTPA_REFCNT, /* u32, read-only */ | ||
| 547 | NDTPA_REACHABLE_TIME, /* u64, read-only, msecs */ | ||
| 548 | NDTPA_BASE_REACHABLE_TIME, /* u64, msecs */ | ||
| 549 | NDTPA_RETRANS_TIME, /* u64, msecs */ | ||
| 550 | NDTPA_GC_STALETIME, /* u64, msecs */ | ||
| 551 | NDTPA_DELAY_PROBE_TIME, /* u64, msecs */ | ||
| 552 | NDTPA_QUEUE_LEN, /* u32 */ | ||
| 553 | NDTPA_APP_PROBES, /* u32 */ | ||
| 554 | NDTPA_UCAST_PROBES, /* u32 */ | ||
| 555 | NDTPA_MCAST_PROBES, /* u32 */ | ||
| 556 | NDTPA_ANYCAST_DELAY, /* u64, msecs */ | ||
| 557 | NDTPA_PROXY_DELAY, /* u64, msecs */ | ||
| 558 | NDTPA_PROXY_QLEN, /* u32 */ | ||
| 559 | NDTPA_LOCKTIME, /* u64, msecs */ | ||
| 560 | __NDTPA_MAX | ||
| 561 | }; | ||
| 562 | #define NDTPA_MAX (__NDTPA_MAX - 1) | ||
| 563 | |||
| 564 | struct ndtmsg | ||
| 565 | { | ||
| 566 | __u8 ndtm_family; | ||
| 567 | __u8 ndtm_pad1; | ||
| 568 | __u16 ndtm_pad2; | ||
| 569 | }; | ||
| 570 | |||
| 571 | struct ndt_config | ||
| 572 | { | ||
| 573 | __u16 ndtc_key_len; | ||
| 574 | __u16 ndtc_entry_size; | ||
| 575 | __u32 ndtc_entries; | ||
| 576 | __u32 ndtc_last_flush; /* delta to now in msecs */ | ||
| 577 | __u32 ndtc_last_rand; /* delta to now in msecs */ | ||
| 578 | __u32 ndtc_hash_rnd; | ||
| 579 | __u32 ndtc_hash_mask; | ||
| 580 | __u32 ndtc_hash_chain_gc; | ||
| 581 | __u32 ndtc_proxy_qlen; | ||
| 582 | }; | ||
| 583 | |||
| 584 | enum { | ||
| 585 | NDTA_UNSPEC, | ||
| 586 | NDTA_NAME, /* char *, unchangeable */ | ||
| 587 | NDTA_THRESH1, /* u32 */ | ||
| 588 | NDTA_THRESH2, /* u32 */ | ||
| 589 | NDTA_THRESH3, /* u32 */ | ||
| 590 | NDTA_CONFIG, /* struct ndt_config, read-only */ | ||
| 591 | NDTA_PARMS, /* nested TLV NDTPA_* */ | ||
| 592 | NDTA_STATS, /* struct ndt_stats, read-only */ | ||
| 593 | NDTA_GC_INTERVAL, /* u64, msecs */ | ||
| 594 | __NDTA_MAX | ||
| 595 | }; | ||
| 596 | #define NDTA_MAX (__NDTA_MAX - 1) | ||
| 597 | |||
| 598 | #define NDTA_RTA(r) ((struct rtattr*)(((char*)(r)) + \ | ||
| 599 | NLMSG_ALIGN(sizeof(struct ndtmsg)))) | ||
| 600 | #define NDTA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ndtmsg)) | ||
| 601 | |||
| 602 | |||
| 496 | /**** | 603 | /**** |
| 497 | * General form of address family dependent message. | 604 | * General form of address family dependent message. |
| 498 | ****/ | 605 | ****/ |
| @@ -789,6 +896,75 @@ extern void __rta_fill(struct sk_buff *skb, int attrtype, int attrlen, const voi | |||
| 789 | ({ if (unlikely(skb_tailroom(skb) < (int)(attrlen))) \ | 896 | ({ if (unlikely(skb_tailroom(skb) < (int)(attrlen))) \ |
| 790 | goto rtattr_failure; \ | 897 | goto rtattr_failure; \ |
| 791 | memcpy(skb_put(skb, RTA_ALIGN(attrlen)), data, attrlen); }) | 898 | memcpy(skb_put(skb, RTA_ALIGN(attrlen)), data, attrlen); }) |
| 899 | |||
| 900 | #define RTA_PUT_U8(skb, attrtype, value) \ | ||
| 901 | ({ u8 _tmp = (value); \ | ||
| 902 | RTA_PUT(skb, attrtype, sizeof(u8), &_tmp); }) | ||
| 903 | |||
| 904 | #define RTA_PUT_U16(skb, attrtype, value) \ | ||
| 905 | ({ u16 _tmp = (value); \ | ||
| 906 | RTA_PUT(skb, attrtype, sizeof(u16), &_tmp); }) | ||
| 907 | |||
| 908 | #define RTA_PUT_U32(skb, attrtype, value) \ | ||
| 909 | ({ u32 _tmp = (value); \ | ||
| 910 | RTA_PUT(skb, attrtype, sizeof(u32), &_tmp); }) | ||
| 911 | |||
| 912 | #define RTA_PUT_U64(skb, attrtype, value) \ | ||
| 913 | ({ u64 _tmp = (value); \ | ||
| 914 | RTA_PUT(skb, attrtype, sizeof(u64), &_tmp); }) | ||
| 915 | |||
| 916 | #define RTA_PUT_SECS(skb, attrtype, value) \ | ||
| 917 | RTA_PUT_U64(skb, attrtype, (value) / HZ) | ||
| 918 | |||
| 919 | #define RTA_PUT_MSECS(skb, attrtype, value) \ | ||
| 920 | RTA_PUT_U64(skb, attrtype, jiffies_to_msecs(value)) | ||
| 921 | |||
| 922 | #define RTA_PUT_STRING(skb, attrtype, value) \ | ||
| 923 | RTA_PUT(skb, attrtype, strlen(value) + 1, value) | ||
| 924 | |||
| 925 | #define RTA_PUT_FLAG(skb, attrtype) \ | ||
| 926 | RTA_PUT(skb, attrtype, 0, NULL); | ||
| 927 | |||
| 928 | #define RTA_NEST(skb, type) \ | ||
| 929 | ({ struct rtattr *__start = (struct rtattr *) (skb)->tail; \ | ||
| 930 | RTA_PUT(skb, type, 0, NULL); \ | ||
| 931 | __start; }) | ||
| 932 | |||
| 933 | #define RTA_NEST_END(skb, start) \ | ||
| 934 | ({ (start)->rta_len = ((skb)->tail - (unsigned char *) (start)); \ | ||
| 935 | (skb)->len; }) | ||
| 936 | |||
| 937 | #define RTA_NEST_CANCEL(skb, start) \ | ||
| 938 | ({ if (start) \ | ||
| 939 | skb_trim(skb, (unsigned char *) (start) - (skb)->data); \ | ||
| 940 | -1; }) | ||
| 941 | |||
| 942 | #define RTA_GET_U8(rta) \ | ||
| 943 | ({ if (!rta || RTA_PAYLOAD(rta) < sizeof(u8)) \ | ||
| 944 | goto rtattr_failure; \ | ||
| 945 | *(u8 *) RTA_DATA(rta); }) | ||
| 946 | |||
| 947 | #define RTA_GET_U16(rta) \ | ||
| 948 | ({ if (!rta || RTA_PAYLOAD(rta) < sizeof(u16)) \ | ||
| 949 | goto rtattr_failure; \ | ||
| 950 | *(u16 *) RTA_DATA(rta); }) | ||
| 951 | |||
| 952 | #define RTA_GET_U32(rta) \ | ||
| 953 | ({ if (!rta || RTA_PAYLOAD(rta) < sizeof(u32)) \ | ||
| 954 | goto rtattr_failure; \ | ||
| 955 | *(u32 *) RTA_DATA(rta); }) | ||
| 956 | |||
| 957 | #define RTA_GET_U64(rta) \ | ||
| 958 | ({ u64 _tmp; \ | ||
| 959 | if (!rta || RTA_PAYLOAD(rta) < sizeof(u64)) \ | ||
| 960 | goto rtattr_failure; \ | ||
| 961 | memcpy(&_tmp, RTA_DATA(rta), sizeof(_tmp)); \ | ||
| 962 | _tmp; }) | ||
| 963 | |||
| 964 | #define RTA_GET_FLAG(rta) (!!(rta)) | ||
| 965 | |||
| 966 | #define RTA_GET_SECS(rta) ((unsigned long) RTA_GET_U64(rta) * HZ) | ||
| 967 | #define RTA_GET_MSECS(rta) (msecs_to_jiffies((unsigned long) RTA_GET_U64(rta))) | ||
| 792 | 968 | ||
| 793 | static inline struct rtattr * | 969 | static inline struct rtattr * |
| 794 | __rta_reserve(struct sk_buff *skb, int attrtype, int attrlen) | 970 | __rta_reserve(struct sk_buff *skb, int attrtype, int attrlen) |
