Add support to set/get all of the igmp's configurable intervals via netlink. These currently are: IFLA_BR_MCAST_LAST_MEMBER_INTVL IFLA_BR_MCAST_MEMBERSHIP_INTVL IFLA_BR_MCAST_QUERIER_INTVL IFLA_BR_MCAST_QUERY_INTVL IFLA_BR_MCAST_QUERY_RESPONSE_INTVL IFLA_BR_MCAST_STARTUP_QUERY_INTVL
Unified · Split
| @@ -253,6 +253,12 @@ enum { · 252 unmodified lines | ||
| 253 | 253 | IFLA_BR_MCAST_HASH_MAX, |
| 254 | 254 | IFLA_BR_MCAST_LAST_MEMBER_CNT, |
| 255 | 255 | IFLA_BR_MCAST_STARTUP_QUERY_CNT, |
| 256 | + IFLA_BR_MCAST_LAST_MEMBER_INTVL, | |
| 257 | + IFLA_BR_MCAST_MEMBERSHIP_INTVL, | |
| 258 | + IFLA_BR_MCAST_QUERIER_INTVL, | |
| 259 | + IFLA_BR_MCAST_QUERY_INTVL, | |
| 260 | + IFLA_BR_MCAST_QUERY_RESPONSE_INTVL, | |
| 261 | + IFLA_BR_MCAST_STARTUP_QUERY_INTVL, | |
| 256 | 262 | __IFLA_BR_MAX, |
| 257 | 263 | }; |
| 258 | 264 | |
| @@ -775,6 +775,12 @@ static const struct nla_policy br_policy[IFLA_BR_MAX + 1] = { · 774 unmodified lines | ||
| 775 | 775 | [IFLA_BR_MCAST_HASH_MAX] = { .type = NLA_U32 }, |
| 776 | 776 | [IFLA_BR_MCAST_LAST_MEMBER_CNT] = { .type = NLA_U32 }, |
| 777 | 777 | [IFLA_BR_MCAST_STARTUP_QUERY_CNT] = { .type = NLA_U32 }, |
| 778 | + [IFLA_BR_MCAST_LAST_MEMBER_INTVL] = { .type = NLA_U64 }, | |
| 779 | + [IFLA_BR_MCAST_MEMBERSHIP_INTVL] = { .type = NLA_U64 }, | |
| 780 | + [IFLA_BR_MCAST_QUERIER_INTVL] = { .type = NLA_U64 }, | |
| 781 | + [IFLA_BR_MCAST_QUERY_INTVL] = { .type = NLA_U64 }, | |
| 782 | + [IFLA_BR_MCAST_QUERY_RESPONSE_INTVL] = { .type = NLA_U64 }, | |
| 783 | + [IFLA_BR_MCAST_STARTUP_QUERY_INTVL] = { .type = NLA_U64 }, | |
| 778 | 784 | }; |
| 779 | 785 | |
| 780 | 786 | static int br_changelink(struct net_device *brdev, struct nlattr *tb[], |
| @@ -927,6 +933,42 @@ static int br_changelink(struct net_device *brdev, struct nlattr *tb[], · 146 unmodified lines | ||
| 927 | 933 | |
| 928 | 934 | br->multicast_startup_query_count = val; |
| 929 | 935 | } |
| 936 | + | |
| 937 | + if (data[IFLA_BR_MCAST_LAST_MEMBER_INTVL]) { | |
| 938 | + u64 val = nla_get_u64(data[IFLA_BR_MCAST_LAST_MEMBER_INTVL]); | |
| 939 | + | |
| 940 | + br->multicast_last_member_interval = clock_t_to_jiffies(val); | |
| 941 | + } | |
| 942 | + | |
| 943 | + if (data[IFLA_BR_MCAST_MEMBERSHIP_INTVL]) { | |
| 944 | + u64 val = nla_get_u64(data[IFLA_BR_MCAST_MEMBERSHIP_INTVL]); | |
| 945 | + | |
| 946 | + br->multicast_membership_interval = clock_t_to_jiffies(val); | |
| 947 | + } | |
| 948 | + | |
| 949 | + if (data[IFLA_BR_MCAST_QUERIER_INTVL]) { | |
| 950 | + u64 val = nla_get_u64(data[IFLA_BR_MCAST_QUERIER_INTVL]); | |
| 951 | + | |
| 952 | + br->multicast_querier_interval = clock_t_to_jiffies(val); | |
| 953 | + } | |
| 954 | + | |
| 955 | + if (data[IFLA_BR_MCAST_QUERY_INTVL]) { | |
| 956 | + u64 val = nla_get_u64(data[IFLA_BR_MCAST_QUERY_INTVL]); | |
| 957 | + | |
| 958 | + br->multicast_query_interval = clock_t_to_jiffies(val); | |
| 959 | + } | |
| 960 | + | |
| 961 | + if (data[IFLA_BR_MCAST_QUERY_RESPONSE_INTVL]) { | |
| 962 | + u64 val = nla_get_u64(data[IFLA_BR_MCAST_QUERY_RESPONSE_INTVL]); | |
| 963 | + | |
| 964 | + br->multicast_query_response_interval = clock_t_to_jiffies(val); | |
| 965 | + } | |
| 966 | + | |
| 967 | + if (data[IFLA_BR_MCAST_STARTUP_QUERY_INTVL]) { | |
| 968 | + u64 val = nla_get_u64(data[IFLA_BR_MCAST_STARTUP_QUERY_INTVL]); | |
| 969 | + | |
| 970 | + br->multicast_startup_query_interval = clock_t_to_jiffies(val); | |
| 971 | + } | |
| 930 | 972 | #endif |
| 931 | 973 | |
| 932 | 974 | return 0; |
| @@ -965,6 +1007,12 @@ static size_t br_get_size(const struct net_device *brdev) · 32 unmodified lines | ||
| 965 | 1007 | nla_total_size(sizeof(u32)) + /* IFLA_BR_MCAST_HASH_MAX */ |
| 966 | 1008 | nla_total_size(sizeof(u32)) + /* IFLA_BR_MCAST_LAST_MEMBER_CNT */ |
| 967 | 1009 | nla_total_size(sizeof(u32)) + /* IFLA_BR_MCAST_STARTUP_QUERY_CNT */ |
| 1010 | + nla_total_size(sizeof(u64)) + /* IFLA_BR_MCAST_LAST_MEMBER_INTVL */ | |
| 1011 | + nla_total_size(sizeof(u64)) + /* IFLA_BR_MCAST_MEMBERSHIP_INTVL */ | |
| 1012 | + nla_total_size(sizeof(u64)) + /* IFLA_BR_MCAST_QUERIER_INTVL */ | |
| 1013 | + nla_total_size(sizeof(u64)) + /* IFLA_BR_MCAST_QUERY_INTVL */ | |
| 1014 | + nla_total_size(sizeof(u64)) + /* IFLA_BR_MCAST_QUERY_RESPONSE_INTVL */ | |
| 1015 | + nla_total_size(sizeof(u64)) + /* IFLA_BR_MCAST_STARTUP_QUERY_INTVL */ | |
| 968 | 1016 | #endif |
| 969 | 1017 | 0; |
| 970 | 1018 | } |
| @@ -972,7 +1020,7 @@ static size_t br_get_size(const struct net_device *brdev) · 1 unmodified line | ||
| 972 | 1020 | static int br_fill_info(struct sk_buff *skb, const struct net_device *brdev) |
| 973 | 1021 | { |
| 974 | 1022 | struct net_bridge *br = netdev_priv(brdev); |
| 975 | − u64 hello_timer, tcn_timer, topology_change_timer, gc_timer; | |
| 1023 | + u64 hello_timer, tcn_timer, topology_change_timer, gc_timer, clockval; | |
| 976 | 1024 | u32 forward_delay = jiffies_to_clock_t(br->forward_delay); |
| 977 | 1025 | u32 hello_time = jiffies_to_clock_t(br->hello_time); |
| 978 | 1026 | u32 age_time = jiffies_to_clock_t(br->max_age); |
| @@ -993,6 +1041,7 @@ static int br_fill_info(struct sk_buff *skb, const struct net_device *brdev) · 14 unmodified lines | ||
| 993 | 1041 | tcn_timer = br_timer_value(&br->tcn_timer); |
| 994 | 1042 | topology_change_timer = br_timer_value(&br->topology_change_timer); |
| 995 | 1043 | gc_timer = br_timer_value(&br->gc_timer); |
| 1044 | + clockval = 0; | |
| 996 | 1045 | |
| 997 | 1046 | if (nla_put_u32(skb, IFLA_BR_FORWARD_DELAY, forward_delay) || |
| 998 | 1047 | nla_put_u32(skb, IFLA_BR_HELLO_TIME, hello_time) || |
| @@ -1036,6 +1085,25 @@ static int br_fill_info(struct sk_buff *skb, const struct net_device *brdev) · 37 unmodified lines | ||
| 1036 | 1085 | nla_put_u32(skb, IFLA_BR_MCAST_STARTUP_QUERY_CNT, |
| 1037 | 1086 | br->multicast_startup_query_count)) |
| 1038 | 1087 | return -EMSGSIZE; |
| 1088 | + | |
| 1089 | + clockval = jiffies_to_clock_t(br->multicast_last_member_interval); | |
| 1090 | + if (nla_put_u64(skb, IFLA_BR_MCAST_LAST_MEMBER_INTVL, clockval)) | |
| 1091 | + return -EMSGSIZE; | |
| 1092 | + clockval = jiffies_to_clock_t(br->multicast_membership_interval); | |
| 1093 | + if (nla_put_u64(skb, IFLA_BR_MCAST_MEMBERSHIP_INTVL, clockval)) | |
| 1094 | + return -EMSGSIZE; | |
| 1095 | + clockval = jiffies_to_clock_t(br->multicast_querier_interval); | |
| 1096 | + if (nla_put_u64(skb, IFLA_BR_MCAST_QUERIER_INTVL, clockval)) | |
| 1097 | + return -EMSGSIZE; | |
| 1098 | + clockval = jiffies_to_clock_t(br->multicast_query_interval); | |
| 1099 | + if (nla_put_u64(skb, IFLA_BR_MCAST_QUERY_INTVL, clockval)) | |
| 1100 | + return -EMSGSIZE; | |
| 1101 | + clockval = jiffies_to_clock_t(br->multicast_query_response_interval); | |
| 1102 | + if (nla_put_u64(skb, IFLA_BR_MCAST_QUERY_RESPONSE_INTVL, clockval)) | |
| 1103 | + return -EMSGSIZE; | |
| 1104 | + clockval = jiffies_to_clock_t(br->multicast_startup_query_interval); | |
| 1105 | + if (nla_put_u64(skb, IFLA_BR_MCAST_STARTUP_QUERY_INTVL, clockval)) | |
| 1106 | + return -EMSGSIZE; | |
| 1039 | 1107 | #endif |
| 1040 | 1108 | |
| 1041 | 1109 | return 0; |