summaryrefslogtreecommitdiffstats
path: root/watchlink/netlink_linkstatus.cc
diff options
context:
space:
mode:
authorStephen Hemminger <stephen.hemminger@vyatta.com>2008-04-29 16:56:56 -0700
committerStephen Hemminger <stephen.hemminger@vyatta.com>2008-04-29 16:56:56 -0700
commita8726835c9064a1f2c6a261b14c637950abdd2bc (patch)
treefc9add560d1919d3f2c050d3da486038fba9e355 /watchlink/netlink_linkstatus.cc
parente87f46b4abc10fe3fc59562d6be25fb96bce1970 (diff)
downloadquagga-a8726835c9064a1f2c6a261b14c637950abdd2bc.tar.bz2
quagga-a8726835c9064a1f2c6a261b14c637950abdd2bc.tar.xz
remove watchlink - no longer used
The watchlink daemon is no longer used, so code can be removed. If it is needed for future changes it can be recovered from the source code control system.
Diffstat (limited to 'watchlink/netlink_linkstatus.cc')
-rw-r--r--watchlink/netlink_linkstatus.cc318
1 files changed, 0 insertions, 318 deletions
diff --git a/watchlink/netlink_linkstatus.cc b/watchlink/netlink_linkstatus.cc
deleted file mode 100644
index 9dd26fbd..00000000
--- a/watchlink/netlink_linkstatus.cc
+++ /dev/null
@@ -1,318 +0,0 @@
-/*
- * Module: netlink_linkstatus.cc
- *
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 as published
- * by the Free Software Foundation.
- */
-#include <stdio.h>
-#include <sys/socket.h>
-#include <sys/file.h>
-#include <iostream>
-#include <string>
-#include <syslog.h>
-#include <errno.h>
-
-#include "rl_str_proc.hh"
-#include "netlink_send.hh"
-#include "netlink_event.hh"
-#include "netlink_utils.hh"
-#include "netlink_linkstatus.hh"
-
-
-using namespace std;
-
-/**
- *
- *
- **/
-NetlinkLinkStatus::NetlinkLinkStatus(int send_sock, const string &link_dir, bool debug) :
- _nl_send(debug),
- _send_sock(send_sock),
- _link_dir(link_dir),
- _debug(debug)
-{
- if (_send_sock < 0) {
- syslog(LOG_ERR,"NetlinkListStatus::NetlinkLinkStatus(), send sock is bad value");
- cerr << "NetlinkListStatus::NetlinkLinkStatus(), send sock is bad value" << endl;
- }
-
- if (_link_dir.empty()) {
- syslog(LOG_ERR,"NetlinkListStatus::NetlinkLinkStatus(), no link status directory specified");
- cerr << "NetlinkListStatus::NetlinkLinkStatus(), no link status directory specified" << endl;
- }
-}
-
-/**
- *
- *
- **/
-NetlinkLinkStatus::~NetlinkLinkStatus()
-{
-}
-
-/**
- *
- *
- **/
-void
-NetlinkLinkStatus::process(const NetlinkEvent &event)
-{
- bool state_event = false;
-
- IfaceStateIter iter = _iface_state_coll.find(event.get_index());
- if (iter == _iface_state_coll.end()) {
- if (event.get_type() == RTM_NEWLINK || event.get_type() == RTM_DELLINK) {
- //start maintaining state information here.
- _iface_state_coll.insert(pair<int,bool>(event.get_index(),event.get_running()));
-
- //let's clean up directory here!
- char buf[40];
- sprintf(buf,"%d",event.get_index());
- string file = _link_dir + "/" + buf;
- unlink(file.c_str());
- }
- return;
- }
-
- bool running_old = iter->second;
- bool running_new = event.get_running();
-
- //capture link status on link messages only
- if (event.get_type() == RTM_NEWLINK ||
- event.get_type() == RTM_DELLINK) {
- // _iface_state_coll.insert(pair<int,bool>(event.get_index(),event.get_running()));
- _iface_state_coll[event.get_index()] = event.get_running();
- if (running_old != running_new) {
- state_event = true;
- }
- }
-
- //is this a transition from up->down, or down->up?
- if (state_event) {
- if (running_new) {
- process_going_up(event);
- }
- else {
- process_going_down(event);
- }
- }
- else {
- if (running_old) {
- process_up(event);
- }
- else {
- process_down(event);
- }
- }
-}
-
-/**
- *
- * file is in the format of IFINDEX,IP,MASK
- *
- **/
-int
-NetlinkLinkStatus::process_up(const NetlinkEvent &event)
-{
- if (_debug) {
- cout << "NetlinkLinkStatus::process_up(): " << event.get_iface() << endl;
- }
- //can't think of anything that needs to go here yet.
- return 0;
-}
-
-/**
- *
- *
- **/
-int
-NetlinkLinkStatus::process_going_up(const NetlinkEvent &event)
-{
- if (_debug) {
- cout << "NetlinkLinkStatus::process_going_up(): " << event.get_iface() << endl;
- }
- syslog(LOG_INFO,"Interface is now active: %s",event.get_iface().c_str());
-
- //check for link status file, otherwise return
- char buf[40];
- sprintf(buf,"%d",event.get_index());
- string file = _link_dir + "/" + buf;
- FILE *fp = fopen(file.c_str(), "r");
- if (fp == NULL) {
- syslog(LOG_INFO,"NetlinkLinkStatus::process_going_up(), failed to open state file: %s",
- strerror(errno));
- // cerr << "NetlinkLinkStatus::process_going_up(), failed to open state file" << endl;
- return -1; //means we are still up, ignore...
- }
-
- if (flock(fileno(fp), LOCK_SH)) {
- syslog(LOG_INFO, "NetlinkLinkStatus::process_going_up() failed to acquire lock: %s",
- strerror(errno));
- fclose(fp);
- return -1;
- }
-
- char str[1025];
- while (fgets(str, 1024, fp)) {
- string line(str);
-
- StrProc tokens(line, ",");
- if (tokens.size() != 4) {
- syslog(LOG_INFO,"NetlinkLinkStatus::process_up(), failure to parse link status file, exiting(): %s, size: %d", line.c_str(), tokens.size());
- // cerr << "NetlinkLinkStatus::process_up(), failure to parse link status file, exiting(): " << line << ", size: " << tokens.size() << endl;
- fclose(fp);
- return -1;
- }
-
- int ifindex = strtoul(tokens.get(0).c_str(),NULL,10);
- uint32_t local_addr = strtoul(tokens.get(1).c_str(),NULL,10);
- uint32_t addr = strtoul(tokens.get(2).c_str(),NULL,10);
- int mask_len = strtoul(tokens.get(3).c_str(),NULL,10);
-
-
- bool err = _nl_send.send_set(_send_sock, ifindex, local_addr, addr, mask_len, RTM_NEWADDR);
- if (err) {
- syslog(LOG_INFO,"NetlinkLinkStatus::process_up(), failure in setting interface back to up");
- }
- /*
- bool err = _nl_send.send_set_route(_send_sock, ifindex, local_addr, local_addr, 32, RTM_NEWROUTE, RT_TABLE_LOCAL, RTN_LOCAL, RT_SCOPE_HOST);
- if (err) {
- syslog(LOG_INFO,"NetlinkLinkStatus::process_up(), failure in setting interface back to up");
- }
- //COMPUTE FIRST ADDRESS
- uint32_t first_addr = ipv4_first_addr(local_addr, mask_len);
- err = _nl_send.send_set_route(_send_sock, ifindex, local_addr, first_addr, 32, RTM_NEWROUTE, RT_TABLE_LOCAL, RTN_BROADCAST, RT_SCOPE_LINK);
- if (err) {
- syslog(LOG_INFO,"NetlinkLinkStatus::process_up(), failure in setting interface back to up");
- }
- //COMPUTE LAST ADDRESS
- uint32_t last_addr = ipv4_broadcast_addr(local_addr, mask_len);
- err = _nl_send.send_set_route(_send_sock, ifindex, local_addr, last_addr, 32, RTM_NEWROUTE, RT_TABLE_LOCAL, RTN_BROADCAST, RT_SCOPE_LINK);
- if (err) {
- syslog(LOG_INFO,"NetlinkLinkStatus::process_up(), failure in setting interface back to up");
- }
-
- //reinsert addresses to interface
- err = _nl_send.send_set_route(_send_sock, ifindex, local_addr, first_addr, mask_len, RTM_NEWROUTE, RT_TABLE_MAIN, RTN_UNICAST, RT_SCOPE_LINK);
- if (err) {
- syslog(LOG_INFO,"NetlinkLinkStatus::process_up(), failure in setting interface back to up");
- }
- */
- }
-
- fclose(fp);
-
- //remove file
- unlink(file.c_str());
-
- return 0;
-}
-
-/**
- * send an ip flush command and capture all the rtm_deladdr messages to the file...
- *
- **/
-int
-NetlinkLinkStatus::process_down(const NetlinkEvent &event)
-{
- if (_debug) {
- cout << "NetlinkLinkStatus::process_down(): " << event.get_iface() << endl;
- }
-
- if (event.get_type() != RTM_NEWADDR) {
- return 0;
- }
-
- if (event.get_index() < 0 || event.get_local_addr().get() == 0 || event.get_mask_len() < 1) {
- return 0;
- }
-
- if (_debug) {
- cout << "netlinkLinkStatus::process_down(), processing valid request" << endl;
- }
-
- //append to file...
- char buf[40];
- sprintf(buf,"%d",event.get_index());
- string file = _link_dir + "/" + buf;
- FILE *fp = fopen(file.c_str(), "a");
- if (fp == NULL) {
- syslog(LOG_INFO,"NetlinkLinkStatus::process_down(), failed to open state file");
- // cerr << "NetlinkLinkStatus::process_down(), failed to open state file" << endl;
- return -1;
- }
-
- if (flock(fileno(fp), LOCK_EX)) {
- syslog(LOG_INFO, "NetlinkLinkStatus::process_down() failed to acquire lock: %s",
- strerror(errno));
- fclose(fp);
- return -1;
- }
-
- int ifindex = event.get_index();
- uint32_t local_addr = event.get_local_addr().get();
- int mask_len = event.get_mask_len();
-
- //create file on system
- //CRAJ--NEED TO HAVE THIS BE FROM A COLLECTION??? DEPENDS ON FORMAT OF NETLINK MSG
- sprintf(buf,"%d",ifindex);
- string line = string(buf) + ",";
- sprintf(buf,"%d",local_addr);
- line += string(buf) + ",";
- sprintf(buf,"%d",event.get_addr().get());
- line += string(buf) + ",";
- sprintf(buf,"%d",mask_len);
- line += string(buf) + "\n";
-
- fputs(line.c_str(),fp);
-
- bool err = _nl_send.send_set(_send_sock, ifindex, event.get_local_addr().get(), event.get_addr().get(), mask_len, RTM_DELADDR);
- if (err) {
- syslog(LOG_INFO,"NetlinkLinkStatus::process_down(), failure in setting interface down");
- }
-
- /*
- uint32_t first_addr = ipv4_first_addr(local_addr, mask_len);
- //reinsert addresses to interface
- bool err = _nl_send.send_set_route(_send_sock, ifindex, local_addr, first_addr, mask_len, RTM_DELROUTE, RT_TABLE_MAIN, -1,-1);
- if (err) {
- syslog(LOG_INFO,"NetlinkLinkStatus::process_down(), failure in setting interface down");
- }
-
- uint32_t last_addr = ipv4_broadcast_addr(local_addr, mask_len);
- err = _nl_send.send_set_route(_send_sock, ifindex, local_addr, last_addr, 32, RTM_DELROUTE, RT_TABLE_LOCAL, -1,-1);
- if (err) {
- syslog(LOG_INFO,"NetlinkLinkStatus::process_down(), failure in setting interface down");
- }
-
- err = _nl_send.send_set_route(_send_sock, ifindex, first_addr, first_addr, 32, RTM_DELROUTE, RT_TABLE_LOCAL, -1,-1);
- if (err) {
- syslog(LOG_INFO,"NetlinkLinkStatus::process_down(), failure in setting interface down");
- }
-
- err = _nl_send.send_set_route(_send_sock, ifindex, local_addr, local_addr, 32, RTM_DELROUTE, RT_TABLE_LOCAL, -1,-1);
- if (err) {
- syslog(LOG_INFO,"NetlinkLinkStatus::process_down(), failure in setting interface down");
- }
- */
- fclose(fp);
-
- return 0;
-}
-
-int
-NetlinkLinkStatus::process_going_down(const NetlinkEvent &event)
-{
- if (_debug) {
- cout << "NetlinkLinkStatus::process_going_down(): " << event.get_iface() << "(" << event.get_index() << ")" << endl;
- }
- syslog(LOG_INFO,"Interface is now inactive: %s",event.get_iface().c_str());
-
- //pull interface addresses
- if (_nl_send.send_get(_send_sock, RTM_GETADDR, event.get_index())) {
- return -1;
- }
- return 0;
-}