3 * IP MIB group implementation - ip.c
7 #include <net-snmp/net-snmp-config.h>
9 #if defined(IFNET_NEEDS_KERNEL) && !defined(_KERNEL)
11 #define _I_DEFINED_KERNEL
14 #include <sys/param.h>
17 #include <sys/socket.h>
29 #ifdef _I_DEFINED_KERNEL
32 #include <sys/sysctl.h>
33 #ifdef _I_DEFINED_KERNEL
38 #include <sys/sysmp.h>
40 #if HAVE_SYS_TCPIPSTATS_H
41 #include <sys/tcpipstats.h>
47 #include <net/if_var.h>
49 #ifdef _I_DEFINED_KERNEL
53 #include <netinet/in.h>
55 #if HAVE_NETINET_IN_SYSTM_H
56 #include <netinet/in_systm.h>
58 #if HAVE_SYS_HASHING_H
59 #include <sys/hashing.h>
61 #if HAVE_NETINET_IN_VAR_H
62 #include <netinet/in_var.h>
65 #include <netinet/ip.h>
67 #if HAVE_NETINET_IP_VAR_H
68 #include <netinet/ip_var.h>
71 #include <inet/mib2.h>
74 #include <sys/stream.h>
77 #include <net/route.h>
83 #include <net-snmp/net-snmp-includes.h>
84 #include <net-snmp/agent/net-snmp-agent-includes.h>
85 #include <net-snmp/agent/auto_nlist.h>
88 #include "kernel_sunos5.h"
93 #include "kernel_linux.h"
96 #if defined(MIB_IPCOUNTER_SYMBOL) || defined(hpux11)
98 #include <netinet/mib_kern.h>
99 #endif /* MIB_IPCOUNTER_SYMBOL || hpux11 */
101 #include "util_funcs.h"
104 #include "interfaces.h"
105 #include "sysORTable.h"
112 #ifndef MIB_STATS_CACHE_TIMEOUT
113 #define MIB_STATS_CACHE_TIMEOUT 5
115 #ifndef IP_STATS_CACHE_TIMEOUT
116 #define IP_STATS_CACHE_TIMEOUT MIB_STATS_CACHE_TIMEOUT
118 marker_t ip_stats_cache_marker = NULL;
120 /*********************
122 * Kernel & interface information,
123 * and internal forward declarations
125 *********************/
128 /*********************
130 * Initialisation & common implementation functions
132 *********************/
134 extern void init_routes(void);
138 * define the structure we're going to ask the agent to register our
141 struct variable3 ip_variables[] = {
143 {IPFORWARDING, ASN_INTEGER, RWRITE, var_ip, 1, {1}},
144 {IPDEFAULTTTL, ASN_INTEGER, RWRITE, var_ip, 1, {2}},
146 {IPFORWARDING, ASN_INTEGER, RONLY, var_ip, 1, {1}},
147 {IPDEFAULTTTL, ASN_INTEGER, RONLY, var_ip, 1, {2}},
150 {IPINRECEIVES, ASN_COUNTER, RONLY, var_ip, 1, {3}},
152 {IPINHDRERRORS, ASN_COUNTER, RONLY, var_ip, 1, {4}},
154 {IPINADDRERRORS, ASN_COUNTER, RONLY, var_ip, 1, {5}},
155 {IPFORWDATAGRAMS, ASN_COUNTER, RONLY, var_ip, 1, {6}},
157 {IPINUNKNOWNPROTOS, ASN_COUNTER, RONLY, var_ip, 1, {7}},
159 {IPINDISCARDS, ASN_COUNTER, RONLY, var_ip, 1, {8}},
160 {IPINDELIVERS, ASN_COUNTER, RONLY, var_ip, 1, {9}},
162 {IPOUTREQUESTS, ASN_COUNTER, RONLY, var_ip, 1, {10}},
163 {IPOUTDISCARDS, ASN_COUNTER, RONLY, var_ip, 1, {11}},
164 {IPOUTNOROUTES, ASN_COUNTER, RONLY, var_ip, 1, {12}},
165 {IPREASMTIMEOUT, ASN_INTEGER, RONLY, var_ip, 1, {13}},
167 {IPREASMREQDS, ASN_COUNTER, RONLY, var_ip, 1, {14}},
168 {IPREASMOKS, ASN_COUNTER, RONLY, var_ip, 1, {15}},
169 {IPREASMFAILS, ASN_COUNTER, RONLY, var_ip, 1, {16}},
171 {IPFRAGOKS, ASN_COUNTER, RONLY, var_ip, 1, {17}},
172 {IPFRAGFAILS, ASN_COUNTER, RONLY, var_ip, 1, {18}},
173 {IPFRAGCREATES, ASN_COUNTER, RONLY, var_ip, 1, {19}},
174 {IPADADDR, ASN_IPADDRESS, RONLY, var_ipAddrEntry, 3, {20, 1, 1}},
175 {IPADIFINDEX, ASN_INTEGER, RONLY, var_ipAddrEntry, 3, {20, 1, 2}},
177 {IPADNETMASK, ASN_IPADDRESS, RONLY, var_ipAddrEntry, 3, {20, 1, 3}},
179 {IPADBCASTADDR, ASN_INTEGER, RONLY, var_ipAddrEntry, 3, {20, 1, 4}},
180 {IPADREASMMAX, ASN_INTEGER, RONLY, var_ipAddrEntry, 3, {20, 1, 5}},
181 #ifdef BRCM_SNMP_WRITE_SUPPORT
182 {IPROUTEDEST, ASN_IPADDRESS, RWRITE, var_ipRouteEntry, 3, {21, 1, 1}},
183 {IPROUTEIFINDEX, ASN_INTEGER, RWRITE, var_ipRouteEntry, 3, {21, 1, 2}},
184 {IPROUTEMETRIC1, ASN_INTEGER, RWRITE, var_ipRouteEntry, 3, {21, 1, 3}},
185 {IPROUTEMETRIC2, ASN_INTEGER, RWRITE, var_ipRouteEntry, 3, {21, 1, 4}},
186 {IPROUTEMETRIC3, ASN_INTEGER, RWRITE, var_ipRouteEntry, 3, {21, 1, 5}},
187 {IPROUTEMETRIC4, ASN_INTEGER, RWRITE, var_ipRouteEntry, 3, {21, 1, 6}},
188 {IPROUTENEXTHOP, ASN_IPADDRESS, RWRITE, var_ipRouteEntry, 3,
190 {IPROUTETYPE, ASN_INTEGER, RWRITE, var_ipRouteEntry, 3, {21, 1, 8}},
191 {IPROUTEPROTO, ASN_INTEGER, RONLY, var_ipRouteEntry, 3, {21, 1, 9}},
192 {IPROUTEAGE, ASN_INTEGER, RWRITE, var_ipRouteEntry, 3, {21, 1, 10}},
193 {IPROUTEMASK, ASN_IPADDRESS, RWRITE, var_ipRouteEntry, 3, {21, 1, 11}},
194 {IPROUTEMETRIC5, ASN_INTEGER, RWRITE, var_ipRouteEntry, 3,
196 {IPROUTEINFO, ASN_OBJECT_ID, RONLY, var_ipRouteEntry, 3, {21, 1, 13}},
198 {IPROUTEDEST, ASN_IPADDRESS, RONLY, var_ipRouteEntry, 3, {21, 1, 1}},
199 {IPROUTEIFINDEX, ASN_INTEGER, RONLY, var_ipRouteEntry, 3, {21, 1, 2}},
200 {IPROUTEMETRIC1, ASN_INTEGER, RONLY, var_ipRouteEntry, 3, {21, 1, 3}},
201 {IPROUTEMETRIC2, ASN_INTEGER, RONLY, var_ipRouteEntry, 3, {21, 1, 4}},
202 {IPROUTEMETRIC3, ASN_INTEGER, RONLY, var_ipRouteEntry, 3, {21, 1, 5}},
203 {IPROUTEMETRIC4, ASN_INTEGER, RONLY, var_ipRouteEntry, 3, {21, 1, 6}},
204 {IPROUTENEXTHOP, ASN_IPADDRESS, RONLY, var_ipRouteEntry, 3,
206 {IPROUTETYPE, ASN_INTEGER, RONLY, var_ipRouteEntry, 3, {21, 1, 8}},
207 {IPROUTEPROTO, ASN_INTEGER, RONLY, var_ipRouteEntry, 3, {21, 1, 9}},
208 {IPROUTEAGE, ASN_INTEGER, RONLY, var_ipRouteEntry, 3, {21, 1, 10}},
209 {IPROUTEMASK, ASN_IPADDRESS, RONLY, var_ipRouteEntry, 3, {21, 1, 11}},
210 {IPROUTEMETRIC5, ASN_INTEGER, RONLY, var_ipRouteEntry, 3,
212 {IPROUTEINFO, ASN_OBJECT_ID, RONLY, var_ipRouteEntry, 3, {21, 1, 13}},
213 #endif /* BRCM_SNMP_WRITE_SUPPORT */
214 #ifdef USING_MIBII_AT_MODULE
216 {IPMEDIAIFINDEX, ASN_INTEGER, RWRITE, var_atEntry, 3, {22, 1, 1}},
217 {IPMEDIAPHYSADDRESS, ASN_OCTET_STR, RWRITE, var_atEntry, 3,
219 {IPMEDIANETADDRESS, ASN_IPADDRESS, RWRITE, var_atEntry, 3, {22, 1, 3}},
220 {IPMEDIATYPE, ASN_INTEGER, RWRITE, var_atEntry, 3, {22, 1, 4}},
223 {IPMEDIAIFINDEX, ASN_INTEGER, RONLY, var_atEntry, 3, {22, 1, 1}},
224 {IPMEDIAPHYSADDRESS, ASN_OCTET_STR, RONLY, var_atEntry, 3, {22, 1, 2}},
225 {IPMEDIANETADDRESS, ASN_IPADDRESS, RONLY, var_atEntry, 3, {22, 1, 3}},
226 {IPMEDIATYPE, ASN_INTEGER, RONLY, var_atEntry, 3, {22, 1, 4}},
227 #endif /* SNMP_AT_MIB */
230 {IPROUTEDISCARDS, ASN_COUNTER, RONLY, var_ip, 1, {23}}
234 * Define the OID pointer to the top of the mib tree that we're
235 * registering underneath, and the OID of the MIB module
237 oid ip_variables_oid[] = { SNMP_OID_MIB2, 4 };
238 oid ip_module_oid[] = { SNMP_OID_MIB2, 4 };
239 oid ip_module_oid_len = sizeof(ip_module_oid) / sizeof(oid);
240 int ip_module_count = 0; /* Need to liaise with icmp.c */
246 * register ourselves with the agent to handle our mib tree
248 REGISTER_MIB("mibII/ip", ip_variables, variable3, ip_variables_oid);
250 #ifdef SNMP_SYSOR_MIB
251 if (++ip_module_count == 2)
252 REGISTER_SYSOR_ENTRY(ip_module_oid,
253 "The MIB module for managing IP and ICMP implementations");
254 #endif /* SNMP_SYSOR_MIB */
257 * for speed optimization, we call this now to do the lookup
260 auto_nlist(IPSTAT_SYMBOL, 0, 0);
262 #ifdef IP_FORWARDING_SYMBOL
263 auto_nlist(IP_FORWARDING_SYMBOL, 0, 0);
265 #ifdef TCP_TTL_SYMBOL
266 auto_nlist(TCP_TTL_SYMBOL, 0, 0);
268 #ifdef MIB_IPCOUNTER_SYMBOL
269 auto_nlist(MIB_IPCOUNTER_SYMBOL, 0, 0);
272 init_kernel_sunos5();
277 /*********************
279 * System specific implementation functions
281 *********************/
284 #define IP_STAT_STRUCTURE struct ip_mib
285 #define USES_SNMP_DESIGNED_IPSTAT
289 #define IP_STAT_STRUCTURE mib2_ip_t
290 #define USES_SNMP_DESIGNED_IPSTAT
294 #define IP_STAT_STRUCTURE int
297 #ifdef HAVE_SYS_TCPIPSTATS_H
298 #define IP_STAT_STRUCTURE struct kna
299 #define USES_TRADITIONAL_IPSTAT
303 #include <iphlpapi.h>
304 #define IP_STAT_STRUCTURE MIB_IPSTATS
305 WriteMethod writeIpStats;
307 long oldipForwarding;
308 long ipTTL, oldipTTL;
311 #if !defined(IP_STAT_STRUCTURE)
312 #define IP_STAT_STRUCTURE struct ipstat
313 #define USES_TRADITIONAL_IPSTAT
316 long read_ip_stat(IP_STAT_STRUCTURE *, int);
319 var_ip(struct variable *vp,
322 int exact, size_t * var_len, WriteMethod ** write_method)
324 static IP_STAT_STRUCTURE ipstat;
325 static long ret_value;
327 if (header_generic(vp, name, length, exact, var_len, write_method) ==
331 ret_value = read_ip_stat(&ipstat, vp->magic);
335 #ifdef HAVE_SYS_TCPIPSTATS_H
337 * This actually reads statistics for *all* the groups together,
338 * so we need to isolate the IP-specific bits.
340 #define ipstat ipstat.ipstat
344 #ifdef USES_SNMP_DESIGNED_IPSTAT
346 return (u_char *) & ipstat.ipForwarding;
348 return (u_char *) & ipstat.ipDefaultTTL;
350 return (u_char *) & ipstat.ipInReceives;
352 return (u_char *) & ipstat.ipInHdrErrors;
354 return (u_char *) & ipstat.ipInAddrErrors;
355 case IPFORWDATAGRAMS:
356 return (u_char *) & ipstat.ipForwDatagrams;
357 case IPINUNKNOWNPROTOS:
358 return (u_char *) & ipstat.ipInUnknownProtos;
360 return (u_char *) & ipstat.ipInDiscards;
362 return (u_char *) & ipstat.ipInDelivers;
364 return (u_char *) & ipstat.ipOutRequests;
366 return (u_char *) & ipstat.ipOutDiscards;
368 return (u_char *) & ipstat.ipOutNoRoutes;
370 return (u_char *) & ipstat.ipReasmTimeout;
372 return (u_char *) & ipstat.ipReasmReqds;
374 return (u_char *) & ipstat.ipReasmOKs;
376 return (u_char *) & ipstat.ipReasmFails;
378 return (u_char *) & ipstat.ipFragOKs;
380 return (u_char *) & ipstat.ipFragFails;
382 return (u_char *) & ipstat.ipFragCreates;
383 case IPROUTEDISCARDS:
384 return (u_char *) & ipstat.ipRoutingDiscards;
389 #ifdef USES_TRADITIONAL_IPSTAT
391 return (u_char *) & ret_value;
393 return (u_char *) & ret_value;
395 long_return = ipstat.ips_total;
396 return (u_char *) & long_return;
398 long_return = ipstat.ips_badsum
399 + ipstat.ips_tooshort
400 + ipstat.ips_toosmall + ipstat.ips_badhlen + ipstat.ips_badlen;
401 return (u_char *) & long_return;
403 long_return = ipstat.ips_cantforward;
404 return (u_char *) & long_return;
405 case IPFORWDATAGRAMS:
406 long_return = ipstat.ips_forward;
407 return (u_char *) & long_return;
408 case IPINUNKNOWNPROTOS:
409 #if STRUCT_IPSTAT_HAS_IPS_NOPROTO
410 long_return = ipstat.ips_noproto;
411 return (u_char *) & long_return;
416 #if STRUCT_IPSTAT_HAS_IPS_FRAGDROPPED
417 long_return = ipstat.ips_fragdropped; /* ?? */
418 return (u_char *) & long_return;
423 #if STRUCT_IPSTAT_HAS_IPS_DELIVERED
424 long_return = ipstat.ips_delivered;
425 return (u_char *) & long_return;
430 #if STRUCT_IPSTAT_HAS_IPS_LOCALOUT
431 long_return = ipstat.ips_localout;
432 return (u_char *) & long_return;
437 #if STRUCT_IPSTAT_HAS_IPS_ODROPPED
438 long_return = ipstat.ips_odropped;
439 return (u_char *) & long_return;
445 * XXX: how to calculate this (counts dropped routes, not packets)?
446 * ipstat.ips_cantforward isn't right, as it counts packets.
447 * ipstat.ips_noroute is also incorrect.
451 long_return = IPFRAGTTL;
452 return (u_char *) & long_return;
454 long_return = ipstat.ips_fragments;
455 return (u_char *) & long_return;
457 #if STRUCT_IPSTAT_HAS_IPS_REASSEMBLED
458 long_return = ipstat.ips_reassembled;
459 return (u_char *) & long_return;
464 long_return = ipstat.ips_fragdropped + ipstat.ips_fragtimeout;
465 return (u_char *) & long_return;
466 case IPFRAGOKS: /* XXX */
467 long_return = ipstat.ips_fragments
468 - (ipstat.ips_fragdropped + ipstat.ips_fragtimeout);
469 return (u_char *) & long_return;
471 #if STRUCT_IPSTAT_HAS_IPS_CANTFRAG
472 long_return = ipstat.ips_cantfrag;
473 return (u_char *) & long_return;
478 #if STRUCT_IPSTAT_HAS_IPS_OFRAGMENTS
479 long_return = ipstat.ips_ofragments;
480 return (u_char *) & long_return;
484 case IPROUTEDISCARDS:
485 #if STRUCT_IPSTAT_HAS_IPS_NOROUTE
486 long_return = ipstat.ips_noroute;
487 return (u_char *) & long_return;
492 #endif /* USE_TRADITIONAL_IPSTAT */
495 *write_method = writeIpStats;
496 ipForwarding = ipstat.dwForwarding;
497 return (u_char *) & ipstat.dwForwarding;
499 *write_method = writeIpStats;
500 ipTTL = ipstat.dwDefaultTTL;
501 return (u_char *) & ipstat.dwDefaultTTL;
503 return (u_char *) & ipstat.dwInReceives;
505 return (u_char *) & ipstat.dwInHdrErrors;
507 return (u_char *) & ipstat.dwInAddrErrors;
508 case IPFORWDATAGRAMS:
509 return (u_char *) & ipstat.dwForwDatagrams;
510 case IPINUNKNOWNPROTOS:
511 return (u_char *) & ipstat.dwInUnknownProtos;
513 return (u_char *) & ipstat.dwInDiscards;
515 return (u_char *) & ipstat.dwInDelivers;
517 return (u_char *) & ipstat.dwOutRequests;
519 return (u_char *) & ipstat.dwOutDiscards;
521 return (u_char *) & ipstat.dwOutNoRoutes;
523 return (u_char *) & ipstat.dwReasmTimeout;
525 return (u_char *) & ipstat.dwReasmReqds;
527 return (u_char *) & ipstat.dwReasmOks;
529 return (u_char *) & ipstat.dwReasmFails;
531 return (u_char *) & ipstat.dwFragOks;
533 return (u_char *) & ipstat.dwFragFails;
535 return (u_char *) & ipstat.dwFragCreates;
536 case IPROUTEDISCARDS:
537 return (u_char *) & ipstat.dwRoutingDiscards;
541 DEBUGMSGTL(("snmpd", "unknown sub-id %d in var_ip\n", vp->magic));
545 #ifdef HAVE_SYS_TCPIPSTATS_H
552 /*********************
554 * Internal implementation functions
556 *********************/
559 read_ip_stat(IP_STAT_STRUCTURE * ipstat, int magic)
562 #if (defined(CAN_USE_SYSCTL) && defined(IPCTL_STATS))
565 #if !(defined (linux) || defined(solaris2))
566 static int ttl, forward;
574 #if (defined(CAN_USE_SYSCTL) && defined(IPCTL_STATS))
575 static int sname[4] = { CTL_NET, PF_INET, IPPROTO_IP, 0 };
580 if ((fd = open_mib("/dev/ip", O_RDONLY, 0, NM_ASYNC_OFF)) < 0)
581 return (-1); /* error */
585 p.objid = ID_ipForwarding;
588 p.objid = ID_ipDefaultTTL;
591 p.objid = ID_ipInReceives;
594 p.objid = ID_ipInHdrErrors;
597 p.objid = ID_ipInAddrErrors;
599 case IPFORWDATAGRAMS:
600 p.objid = ID_ipForwDatagrams;
602 case IPINUNKNOWNPROTOS:
603 p.objid = ID_ipInUnknownProtos;
606 p.objid = ID_ipInDiscards;
609 p.objid = ID_ipInDelivers;
612 p.objid = ID_ipOutRequests;
615 p.objid = ID_ipOutDiscards;
618 p.objid = ID_ipOutNoRoutes;
621 p.objid = ID_ipReasmTimeout;
624 p.objid = ID_ipReasmReqds;
627 p.objid = ID_ipReasmOKs;
630 p.objid = ID_ipReasmFails;
633 p.objid = ID_ipFragOKs;
636 p.objid = ID_ipFragFails;
639 p.objid = ID_ipFragCreates;
641 case IPROUTEDISCARDS:
642 p.objid = ID_ipRoutingDiscards;
650 p.buffer = (void *) ipstat;
651 ulen = sizeof(IP_STAT_STRUCTURE);
653 ret_value = get_mib_info(fd, &p);
656 return (ret_value); /* 0: ok, < 0: error */
660 if (ip_stats_cache_marker &&
662 (ip_stats_cache_marker, IP_STATS_CACHE_TIMEOUT * 1000)))
663 #if !(defined(linux) || defined(solaris2))
664 return ((magic == IPFORWARDING ? forward :
665 (magic == IPDEFAULTTTL ? ttl : 0)));
670 if (ip_stats_cache_marker)
671 atime_setMarker(ip_stats_cache_marker);
673 ip_stats_cache_marker = atime_newMarker();
677 ret_value = linux_read_ip_stat(ipstat);
682 getMibstat(MIB_IP, ipstat, sizeof(mib2_ip_t), GET_FIRST,
683 &Get_everything, NULL);
687 ret_value = GetIpStatistics(ipstat);
690 #if !(defined(linux) || defined(solaris2) || defined(WIN32))
691 if (magic == IPFORWARDING) {
693 #if defined(CAN_USE_SYSCTL) && defined(IPCTL_STATS)
695 sname[3] = IPCTL_FORWARDING;
696 if (sysctl(sname, 4, &i, &len, 0, 0) < 0)
699 forward = (i ? 1 /* GATEWAY */
703 (IP_FORWARDING_SYMBOL, (char *) &ret_value, sizeof(ret_value)))
706 forward = (ret_value ? 1 /* GATEWAY */
710 free(ip_stats_cache_marker);
711 ip_stats_cache_marker = NULL;
716 if (magic == IPDEFAULTTTL) {
718 #if (defined(CAN_USE_SYSCTL) && defined(IPCTL_STATS))
720 sname[3] = IPCTL_DEFTTL;
721 if (sysctl(sname, 4, &i, &len, 0, 0) < 0)
727 (TCP_TTL_SYMBOL, (char *) &ret_value, sizeof(ret_value)))
733 free(ip_stats_cache_marker);
734 ip_stats_cache_marker = NULL;
739 #ifdef HAVE_SYS_TCPIPSTATS_H
740 ret_value = sysmp(MP_SAGET, MPSA_TCPIPSTATS, ipstat, sizeof *ipstat);
743 #if (defined(CAN_USE_SYSCTL) && defined(IPCTL_STATS))
744 len = sizeof *ipstat;
745 sname[3] = IPCTL_STATS;
746 ret_value = sysctl(sname, 4, ipstat, &len, 0, 0);
749 if (auto_nlist(IPSTAT_SYMBOL, (char *) ipstat, sizeof(*ipstat)))
752 #endif /* !(defined(linux) || defined(solaris2)) */
754 if (ret_value == -1) {
755 free(ip_stats_cache_marker);
756 ip_stats_cache_marker = NULL;
764 writeIpStats(int action,
768 u_char * statP, oid * name, size_t name_len)
773 int retval = SNMP_ERR_NOERROR;
775 * #define for ip scalar objects are 1 less than corresponding sub-id in MIB
776 * * i.e. IPFORWARDING defined as 0, but ipForwarding registered as 1
782 oldbuf = &oldipForwarding;
789 return SNMP_ERR_NOTWRITABLE;
793 case RESERVE1: /* Check values for acceptability */
794 if (var_val_type != ASN_INTEGER) {
795 snmp_log(LOG_ERR, "not integer\n");
796 return SNMP_ERR_WRONGTYPE;
798 if (var_val_len > sizeof(int)) {
799 snmp_log(LOG_ERR, "bad length\n");
800 return SNMP_ERR_WRONGLENGTH;
804 if (((int) *var_val < 1) || ((int) *var_val > 2)) {
805 snmp_log(LOG_ERR, "not supported ip forwarding : %d\n",
807 return SNMP_ERR_WRONGVALUE;
811 if ((int) *var_val < 0) {
812 snmp_log(LOG_ERR, "not supported ip Default : %d\n",
814 return SNMP_ERR_WRONGVALUE;
819 case RESERVE2: /* Allocate memory and similar resources */
824 * Save the old value, in case of UNDO
828 *buf = (int) *var_val;
831 case UNDO: /* Reverse the SET action and free resources */
835 case COMMIT: /* Confirm the SET, performing any irreversible actions,
836 * and free resources */
840 * Currently windows supports only ON->OFF
842 ipStats.dwForwarding = *buf;
843 ipStats.dwDefaultTTL = MIB_USE_CURRENT_TTL;
844 if (SetIpStatistics(&ipStats) != NO_ERROR) {
845 retval = SNMP_ERR_COMMITFAILED;
847 "Can't set ipForwarding, supports only enable->disable \n");
851 if (SetIpTTL((UINT) * buf) != NO_ERROR) {
852 retval = SNMP_ERR_COMMITFAILED;
853 snmp_log(LOG_ERR, "Can't set ipDefaultTTL\n");
858 case FREE: /* Free any resources allocated */
862 } /* end of writeIpStats */
870 #endif /* SNMP_IP_MIB */