def ask_for_global_table(): controller_index = config_data['controller_index'] src_ip = '' dst_ip = '' netmask = '' for interface in config_data['interfaces']: if interface['counter_index'] != controller_index: continue # now counter_index is controller_index src_ip = interface['vip'] dst_ip = interface['counter_vip'] netmask = interface['netmask'] logger.debug( 'going to send route table request msg\n, \ src_ip %s, dst_ip %s, netmask %s', src_ip, dst_ip, netmask) request_msg = { "code": 0, "msg": "request for route table", "src_index": ROUTER_INDEX } msg_bytes = utilities.objEncode(request_msg) pkg = route.IP_Package(src_ip, dst_ip, dst_ip, netmask, msg_bytes) pkg.protocol = 119 errno = route.link_layer.send(pkg.to_bytes()) if errno < 0: logger.warning('fail to send to link layer, errno: %d', errno)
def broadcastMsg(self, data, protocol=0): interfaces = self.network_layer.interfaces for interface in interfaces: sip = interface.vip dip = interface.counter_vip logger.debug('broadcast to ip %s', dip) self.network_layer.send(sip, dip, utilities.objEncode(data), protocol)
def run_ping(self): logger.info("tracking direct router neighbor threading run...") for interface in self.network_layer.interfaces: src_ip = interface.vip dst_ip = interface.counter_vip netmask = interface.netmask msg = {'code': 0, 'msg': "are you still here?"} self.network_layer.send(src_ip, dst_ip, utilities.objEncode(msg), 100) logger.debug('send ping from %s to %s', src_ip, dst_ip)
def broadcast_logout(self, index): global msgID logger.debug('###########broadcasting!!!!!########') logger.debug('broadcast, id is %d, from index %d', msgID, ROUTER_INDEX) for interface in self.interfaces: src_ip, dst_ip = interface msg = {"type": "logout", "index": index, "id": msgID} msgID += V self.network_layer.send(src_ip, dst_ip, utilities.objEncode(msg), 119)
def broadcast(self, interfaces): rip_msg = { "from" : self.route_name, "topo": self.topo, 'tear_down': self.tear_down, "dv": self.dis_vec } s = utilities.objEncode(rip_msg) for inf in interfaces: pkg = route.IP_Package(inf.vip, inf.counter_vip, inf.counter_vip, 24, s) pkg.protocol = 120 route.link_layer.send(pkg.to_bytes())
def run(self): logger.info('network layer listener begin to work...') while True: ospf_pkg = self.network_layer.recv_ospf() ordinary_pkg = self.network_layer.recv() if ospf_pkg is None and ordinary_pkg is None: time.sleep(0.01) continue if ospf_pkg: src_ip = ospf_pkg.dest_ip dest_ip = ospf_pkg.src_ip netmask = ospf_pkg.net_mask if ospf_pkg.protocol != 119: logger.error( 'error! get ospf pkg, protocol is %d instead of 119', ospf_pkg.protocol) ospf_msg = utilities.objDecode(ospf_pkg.data) logger.info("get ospf msg\n%s", ospf_msg) if ospf_msg['code'] == 0: if not is_controller: logger.warn( "IM NOT CONTROLLER. get request msg. ignore.") continue src_index = ospf_msg['src_index'] init_global_route_table(GLOBAL_ROUTE_INFORMATIOIN_FILE, src_index) sp = calculate_shortest_path(src_index) response_msg = { "code": 1, "msg": "here's your route table", "route_table": sp } response_msg_bytes = utilities.objEncode(response_msg) pkg = route.IP_Package(src_ip, dest_ip, dest_ip, netmask, response_msg_bytes) pkg.protocol = 119 errno = route.link_layer.send(pkg.to_bytes()) if errno < 0: logger.warning( 'fail to send to link layer. errno is %d\n', errno) elif ospf_msg['code'] == 1: logger.info('get route table response msg\n%s', ospf_msg) route_table = ospf_msg['route_table'] for dest_net, netmask, dest_ip in route_table: route.my_route_table.update_item( dest_net, netmask, dest_ip) if ordinary_pkg: #TODO: refine here logger.info("get odinary msg\n%s", ordinary_pkg)
def task(self): time.sleep(0.1) msg_queue = [] msg_queue.append(self.network_layer.recv_ospf()) msg_queue.append(self.network_layer.recv()) msg_queue.append(self.network_layer.recv_ping()) available_msg = [msg for msg in msg_queue if not msg is None] for msg in available_msg: if msg.protocol == 100: data = utilities.objDecode(msg.data) sip = msg.src_ip dip = msg.dest_ip netmask = msg.net_mask if data['code'] == 0: # get ping request from other logger.info('get ping from %s\n', sip) msg = {'code': 1, 'msg': 'I am here.'} self.network_layer.send(dip, sip, utilities.objEncode(msg), 100) if data['code'] == 1: # get ping response from it logger.info('ping response. I know %s reachable', sip) self.tracking_neighbour_alive.wakeup(dip, sip) elif msg.protocol == 119: data = utilities.objDecode(msg.data) msgid = data['id'] if msgid in known_msgid_list: # logger.debug('already know %d, continue', msgid) continue known_msgid_list.append(msgid) self.broadcastMsg(data, 119) msg_type = data['type'] if msg_type == 'logout': # pass #TODO: here, maybe bugs lgout_index = data['index'] logger.info( 'get logout broadcast. now refresh route table according to broadcast %d', lgout_index) logout_refresh_route_table(lgout_index) else: logger.debug('recv msg!!\n%s', msg)
logger.setLevel(logging.INFO) elif main_action == 'o': logger.setLevel(logging.DEBUG) elif main_action == 'cost': _vip = user_args[1] _cost = int(user_args[2]) found = False for intf in rip_worker.interfaces: if intf.vip == _vip: print('Cost {} -> {} changed to {}'.format(rip_worker.route_name, intf.counter_name, _cost)) rip_worker.dis_vec[intf.counter_name]['cost'] = _cost cost_msg = { "vip": intf.counter_vip, "cost": _cost } s = utilities.objEncode(cost_msg) pkg = route.IP_Package(intf.vip, intf.counter_vip, intf.counter_vip, 24, s) pkg.protocol = 121 route.link_layer.send(pkg.to_bytes()) found = True break if found == False: print('{} is not a on-link interface'.format(_vip)) elif main_action == 'q': os._exit(0) except IndexError: print('invalid command!') continue except Exception as e: # 捕获所有异常,并且打印错误信息 print(traceback.format_exc())