add IF_CHECK_UP/DOWN to olsr_ifconfig
authorMarkus Kittenberger <Markus.Kittenberger@gmx.at>
Sun, 10 Jan 2010 12:08:54 +0000 (13:08 +0100)
committerMarkus Kittenberger <Markus.Kittenberger@gmx.at>
Sun, 10 Jan 2010 12:08:54 +0000 (13:08 +0100)
src/kernel_routes.h
src/linux/kernel_routes.c

index c652854..ca33b16 100644 (file)
@@ -59,8 +59,10 @@ static const char TUNL_BASE[IFNAMSIZ] = "tunl0";
 int olsr_netlink_rule(uint8_t, uint8_t, uint16_t, uint32_t, char *);
 
 #define IF_SET_UP 0
-#define IF_SET_IP 1 /*sets up aswell*/
-#define IF_SET_DOWN 2
+#define IF_SET_DOWN 1
+#define IF_SET_IP 2 /*sets up aswell*/
+#define IF_CHECK_UP 3
+#define IF_CHECK_DOWN 4
 
 int olsr_ifconfig(const char *, int);
 int olsr_del_tunl(void);
index 177c163..0b400b0 100644 (file)
@@ -87,10 +87,16 @@ struct olsr_rtreq {
 };
 
 /*takes up or down (flag IF_SET_DOWN) an interface (optionally able to configure an /32 ip aswell IF_SET_IP)*/
-/* return value
- * 0 if failure
- * -1 if success
- *  1 if interface was already up/down and no therefoew was no need to change this*/
+/* parameter
+ * dev device name
+ * flags:
+ * IF_SET_UP, IF_SET_DOWN set interface up or down
+ * IF_CHECK_UP, IF_CHECK_DOWN only check interface state, dont change (returns false or 1)
+ * IF_SET_IP set interface up and set interface ip to originator address
+ * return value:
+ * 0 on error/failure (or failed CHECK)
+ * -1 on success (and interface state was changed)
+ *  1 if interface was already up/down*/
 int olsr_ifconfig(const char * dev,int flag)
 {
   int s, r;
@@ -122,15 +128,17 @@ int olsr_ifconfig(const char * dev,int flag)
   ifr.ifr_flags = IFF_UP; //!!?? read old flags and before setting new ones
   r = ioctl(s, SIOCGIFFLAGS, &ifr);
   /*set to UP/DOWN now*/
-  if (flag == IF_SET_DOWN) {
+  if ((flag == IF_SET_DOWN)||(flag == IF_CHECK_DOWN)) {
     /*check if already down*/
     if ((short int)ifr.ifr_flags & IFF_UP) ifr.ifr_flags &= ~IFF_UP;
     else return 1;
+    if (flag == IF_CHECK_DOWN) return false;
   }
   else {
     /*check if already up*/
     if ((short int)ifr.ifr_flags & IFF_UP) return 1;
     else ifr.ifr_flags |= IFF_UP;
+    if (flag == IF_CHECK_UP) return false;
   }
   
   r = ioctl(s, SIOCSIFFLAGS, &ifr);