]> oss.titaniummirror.com Git - tinyos-2.x.git/blobdiff - support/sdk/c/blip/driver/radvd-1.0/interface.c
Merge TinyOS 2.1.1 into master.
[tinyos-2.x.git] / support / sdk / c / blip / driver / radvd-1.0 / interface.c
diff --git a/support/sdk/c/blip/driver/radvd-1.0/interface.c b/support/sdk/c/blip/driver/radvd-1.0/interface.c
new file mode 100644 (file)
index 0000000..f1fa79e
--- /dev/null
@@ -0,0 +1,248 @@
+/*
+ *   $Id$
+ *
+ *   Authors:
+ *    Lars Fenneberg           <lf@elemental.net>       
+ *
+ *   This software is Copyright 1996,1997 by the above mentioned author(s), 
+ *   All Rights Reserved.
+ *
+ *   The license which is distributed with this software in the file COPYRIGHT
+ *   applies to this software. If your distribution is missing this file, you
+ *   may request it from <pekkas@netcore.fi>.
+ *
+ */
+
+#include "config.h"
+#include "includes.h"
+#include "radvd.h"
+#include "defaults.h"
+
+void
+iface_init_defaults(struct Interface *iface)
+{
+       memset(iface, 0, sizeof(struct Interface));
+
+       iface->HasFailed          = 0;
+       iface->IgnoreIfMissing    = DFLT_IgnoreIfMissing;
+       iface->AdvSendAdvert      = DFLT_AdvSendAdv;
+       iface->MaxRtrAdvInterval  = DFLT_MaxRtrAdvInterval;
+       iface->AdvSourceLLAddress = DFLT_AdvSourceLLAddress;
+       iface->AdvReachableTime   = DFLT_AdvReachableTime;
+       iface->AdvRetransTimer    = DFLT_AdvRetransTimer;
+       iface->AdvLinkMTU         = DFLT_AdvLinkMTU;
+       iface->AdvCurHopLimit     = DFLT_AdvCurHopLimit;
+       iface->AdvIntervalOpt     = DFLT_AdvIntervalOpt;
+       iface->AdvHomeAgentInfo   = DFLT_AdvHomeAgentInfo;
+       iface->AdvHomeAgentFlag   = DFLT_AdvHomeAgentFlag;
+       iface->HomeAgentPreference = DFLT_HomeAgentPreference;
+       iface->MinDelayBetweenRAs   = DFLT_MinDelayBetweenRAs;
+       iface->AdvMobRtrSupportFlag = DFLT_AdvMobRtrSupportFlag;
+
+       iface->MinRtrAdvInterval = -1;
+       iface->AdvDefaultLifetime = -1;
+       iface->AdvDefaultPreference = DFLT_AdvDefaultPreference;
+       iface->HomeAgentLifetime = -1;
+}
+
+void
+prefix_init_defaults(struct AdvPrefix *prefix)
+{
+       memset(prefix, 0, sizeof(struct AdvPrefix));
+               
+       prefix->AdvOnLinkFlag = DFLT_AdvOnLinkFlag;
+       prefix->AdvAutonomousFlag = DFLT_AdvAutonomousFlag;
+       prefix->AdvRouterAddr = DFLT_AdvRouterAddr;
+       prefix->AdvValidLifetime = DFLT_AdvValidLifetime;
+       prefix->AdvPreferredLifetime = DFLT_AdvPreferredLifetime;
+       prefix->if6to4[0] = 0;
+       prefix->enabled = 1;
+}
+
+void
+route_init_defaults(struct AdvRoute *route, struct Interface *iface)
+{
+       memset(route, 0, sizeof(struct AdvRoute));
+               
+       route->AdvRouteLifetime = DFLT_AdvRouteLifetime(iface);
+       route->AdvRoutePreference = DFLT_AdvRoutePreference;
+}
+
+void
+rdnss_init_defaults(struct AdvRDNSS *rdnss, struct Interface *iface)
+{
+       memset(rdnss, 0, sizeof(struct AdvRDNSS));
+               
+       rdnss->AdvRDNSSPreference = DFLT_AdvRDNSSPreference;
+       rdnss->AdvRDNSSOpenFlag = DFLT_AdvRDNSSOpenFlag;
+       rdnss->AdvRDNSSLifetime = DFLT_AdvRDNSSLifetime(iface);
+       rdnss->AdvRDNSSNumber = 0;
+}
+
+int
+check_iface(struct Interface *iface)
+{
+       struct AdvPrefix *prefix;
+       struct AdvRoute *route;
+       int res = 0;
+       int MIPv6 = 0;
+
+       /* Check if we use Mobile IPv6 extensions */
+       if (iface->AdvHomeAgentFlag || iface->AdvHomeAgentInfo ||
+               iface->AdvIntervalOpt)
+       {
+               MIPv6 = 1;
+               flog(LOG_INFO, "using Mobile IPv6 extensions");
+       }
+
+       prefix = iface->AdvPrefixList;  
+       while (!MIPv6 && prefix)
+       {
+               if (prefix->AdvRouterAddr)
+               {
+                       MIPv6 = 1;
+               }
+               prefix = prefix->next;
+       }
+
+       if (iface->MinRtrAdvInterval < 0)
+               iface->MinRtrAdvInterval = DFLT_MinRtrAdvInterval(iface);
+
+       if ((iface->MinRtrAdvInterval < (MIPv6 ? MIN_MinRtrAdvInterval_MIPv6 : MIN_MinRtrAdvInterval)) || 
+                   (iface->MinRtrAdvInterval > MAX_MinRtrAdvInterval(iface)))
+       {
+               flog(LOG_ERR, 
+                       "MinRtrAdvInterval for %s (%.2f) must be at least %.2f but no more than 3/4 of MaxRtrAdvInterval (%.2f)",
+                       iface->Name, iface->MinRtrAdvInterval,
+                       MIPv6 ? MIN_MinRtrAdvInterval_MIPv6 : (int)MIN_MinRtrAdvInterval,
+                       MAX_MinRtrAdvInterval(iface));
+               res = -1;
+       }
+
+       if ((iface->MaxRtrAdvInterval < (MIPv6 ? MIN_MaxRtrAdvInterval_MIPv6 : MIN_MaxRtrAdvInterval)) 
+                       || (iface->MaxRtrAdvInterval > MAX_MaxRtrAdvInterval))
+       {
+               flog(LOG_ERR, 
+                       "MaxRtrAdvInterval for %s (%.2f) must be between %.2f and %d",
+                       iface->Name, iface->MaxRtrAdvInterval,
+                       MIPv6 ? MIN_MaxRtrAdvInterval_MIPv6 : (int)MIN_MaxRtrAdvInterval,
+                       MAX_MaxRtrAdvInterval);
+               res = -1;
+       }
+
+       if (iface->MinDelayBetweenRAs < (MIPv6 ? MIN_DELAY_BETWEEN_RAS_MIPv6 : MIN_DELAY_BETWEEN_RAS)) 
+       {
+               flog(LOG_ERR, 
+                       "MinDelayBetweenRAs for %s (%.2f) must be at least %.2f",
+                       iface->Name, iface->MinDelayBetweenRAs,
+                       MIPv6 ? MIN_DELAY_BETWEEN_RAS_MIPv6 : MIN_DELAY_BETWEEN_RAS);
+               res = -1;
+       }
+
+       if ((iface->AdvLinkMTU != 0) &&
+          ((iface->AdvLinkMTU < MIN_AdvLinkMTU) || 
+          (iface->if_maxmtu != -1 && (iface->AdvLinkMTU > iface->if_maxmtu))))
+       {
+               flog(LOG_ERR,  "AdvLinkMTU for %s (%u) must be zero or between %u and %u",
+               iface->Name, iface->AdvLinkMTU, MIN_AdvLinkMTU, iface->if_maxmtu);
+               res = -1;
+       }
+
+       if (iface->AdvReachableTime >  MAX_AdvReachableTime)
+       {
+               flog(LOG_ERR, 
+                       "AdvReachableTime for %s (%u) must not be greater than %u",
+                       iface->Name, iface->AdvReachableTime, MAX_AdvReachableTime);
+               res = -1;
+       }
+
+       if (iface->AdvCurHopLimit > MAX_AdvCurHopLimit)
+       {
+               flog(LOG_ERR, "AdvCurHopLimit for %s (%u) must not be greater than %u",
+                       iface->Name, iface->AdvCurHopLimit, MAX_AdvCurHopLimit);
+               res = -1;
+       }
+
+       if (iface->AdvDefaultLifetime < 0)
+               iface->AdvDefaultLifetime = DFLT_AdvDefaultLifetime(iface);
+
+       if ((iface->AdvDefaultLifetime != 0) &&
+          ((iface->AdvDefaultLifetime > MAX_AdvDefaultLifetime) ||
+           (iface->AdvDefaultLifetime < MIN_AdvDefaultLifetime(iface))))
+       {
+               flog(LOG_ERR, 
+                       "AdvDefaultLifetime for %s (%u) must be zero or between %u and %u",
+                       iface->Name, iface->AdvDefaultLifetime, (int)MIN_AdvDefaultLifetime(iface),
+                       MAX_AdvDefaultLifetime);
+               res = -1;
+       }
+
+       /* Mobile IPv6 ext */
+       if (iface->HomeAgentLifetime < 0)
+               iface->HomeAgentLifetime = DFLT_HomeAgentLifetime(iface);
+
+       /* Mobile IPv6 ext */
+       if (iface->AdvHomeAgentInfo)
+       {
+               if ((iface->HomeAgentLifetime > MAX_HomeAgentLifetime) ||
+                       (iface->HomeAgentLifetime < MIN_HomeAgentLifetime))
+               {
+                       flog(LOG_ERR, 
+                               "HomeAgentLifetime for %s (%u) must be between %u and %u",
+                               iface->Name, iface->HomeAgentLifetime,
+                               MIN_HomeAgentLifetime, MAX_HomeAgentLifetime);
+                       res = -1;
+               }
+       }
+
+       /* Mobile IPv6 ext */
+       if (iface->AdvHomeAgentInfo && !(iface->AdvHomeAgentFlag))
+       {
+               flog(LOG_ERR, 
+                       "AdvHomeAgentFlag for %s must be set with HomeAgentInfo", iface->Name);
+               res = -1;
+       }
+       if (iface->AdvMobRtrSupportFlag && !(iface->AdvHomeAgentInfo))
+       {
+               flog(LOG_ERR, 
+                       "AdvHomeAgentInfo for %s must be set with AdvMobRtrSupportFlag", iface->Name);
+               res = -1;
+       }
+
+       /* XXX: need this? prefix = iface->AdvPrefixList; */
+
+       while (prefix)
+       {
+               if (prefix->PrefixLen > MAX_PrefixLen)
+               {
+                       flog(LOG_ERR, "invalid prefix length (%u) for %s", prefix->PrefixLen, iface->Name);
+                       res = -1;
+               }
+
+               if (prefix->AdvPreferredLifetime > prefix->AdvValidLifetime)
+               {
+                       flog(LOG_ERR, "AdvValidLifetime for %s (%u) must be "
+                               "greater than AdvPreferredLifetime for", 
+                               iface->Name, prefix->AdvValidLifetime);
+                       res = -1;
+               }
+
+               prefix = prefix->next;
+       }
+
+
+       route = iface->AdvRouteList;
+
+       while(route)
+       {
+               if (route->PrefixLen > MAX_PrefixLen)
+               {
+                       flog(LOG_ERR, "invalid route prefix length (%u) for %s", route->PrefixLen, iface->Name);
+                       res = -1;
+               }
+
+               route = route->next;
+       }
+
+       return res;
+}