?? ipripng_daemon.c
字號:
/* * Copyright 2006 Wind River Systems, Inc. * * The right to copy, distribute, modify or otherwise make use * of this software may be licensed only pursuant to the terms * of an applicable Wind River license agreement. *//*modification history--------------------01c,24jan07,tlu Fix gnu compile warning01b,17nov06,tlu Define the stack size for the RIPng task and reset daemon_started to IP_FALSE at function ripngStop()01a,12jun06,tlu Initial creation*//* **************************************************************************** * 1 DESCRIPTION **************************************************************************** *//* **************************************************************************** * 2 CONFIGURATION **************************************************************************** *//* **************************************************************************** * 3 INCLUDE FILES **************************************************************************** */#define IPCOM_USE_CLIB_PROTO#include <ipcom_type.h>#include <ipcom_cstyle.h>#include <ipcom_clib.h>#include <ipcom_err.h>#include <ipcom_os.h>#include <ipcom_sock.h>#include <ipcom_sock2.h>#include <ipcom_inet.h>#include <ipcom_syslog.h>#include <ipcom_ipd.h>#include <ipcom_errno.h>#include <ipnet_config.h>#include <ipnet.h>#include <ipnet_cmd.h>#include <ipnet_h.h>#include <ipnet_ip6.h>#include "ipripng.h"#include "ipripng_constant.h"/* **************************************************************************** * 4 DEFINES **************************************************************************** */#ifndef IPNET#error IPRIPNG_REQUIRES_IPNET#endif#define IPNET_IF_LOOPBACK_INDEX 1 /* The index of the loopback interface */#define RIPTASKSTACK 20000 /* RIPng task stack size *//* **************************************************************************** * 5 TYPES **************************************************************************** *//* **************************************************************************** * 6 EXTERN PROTOTYPES **************************************************************************** *//* **************************************************************************** * 7 LOCAL PROTOTYPES **************************************************************************** */IP_STATIC Ip_err ipripng_write(Ip_fd udp_fd, void *cookie, Ip_u32 ipaddr_n, Ipcom_sock_addr *dest, void *buf, Ip_size_t len);IP_STATIC Ip_err ipripng_add_route_rtsock(Ipripng_rt *rrt, const struct in6_addr *gw, struct ifc *ifcp);IP_STATIC Ip_err ipripng_delete_route_rtsock(struct netinfo6 *np, const struct in6_addr *gw, Ip_bool proto_set);IPCOM_PROCESS(ipripngd);IP_PUBLIC Ip_err ipripng_create(void);/* **************************************************************************** * 8 DATA **************************************************************************** */IP_STATIC Ip_bool daemon_started = IP_FALSE;IP_PUBLIC Ip_bool ripngStopFlag;IP_PUBLIC char ripng_cmdString[IPRIPNG_MAXARGS + 2];IP_STATIC int priv_ripng_seq;#if IPRIP_SYSLOG_PRIORITY >= IPCOM_LOG_DEBUG2IP_STATIC Ipnet_cmd_int_str_map iprip_rtm_map[] ={ { IPNET_RTM_ADD, "ADD" }, { IPNET_RTM_DELETE, "DELETE" }, { IPNET_RTM_CHANGE, "CHANGE" }, { IPNET_RTM_GET, "GET" }, { IPNET_RTM_LOOSING, "LOOSING" }, { IPNET_RTM_REDIRECT, "REDIRECT" }, { IPNET_RTM_MISS, "MISS" }, { IPNET_RTM_LOCK, "LOCK" }, { IPNET_RTM_RESOLVE, "RESOLVE" }, { IPNET_RTM_NEWADDR, "NEWADDR" }, { IPNET_RTM_DELADDR, "DELADDR" }, { IPNET_RTM_IFINFO, "IFINFO" }, { -1, IP_NULL }};IP_STATIC Ipnet_cmd_int_str_map iprip_rta_map[] ={ { IPNET_RTAX_DST, "DST" }, { IPNET_RTAX_GATEWAY, "GATEWAY" }, { IPNET_RTAX_NETMASK, "NETMASK" }, { IPNET_RTAX_GENMASK, "GENMASK" }, { IPNET_RTAX_IFP, "IFP" }, { IPNET_RTAX_IFA, "IFA" }, { IPNET_RTAX_AUTHOR, "AUTHOR" }, { IPNET_RTAX_BRD, "BRD" }, { -1, IP_NULL }};#endif/* **************************************************************************** * 9 LOCAL FUNCTIONS **************************************************************************** *//* *=========================================================================== * ipripng_rtsock_add *=========================================================================== * Description: * Parameters: * Returns: * */IP_STATIC Ip_erripripng_rtsock_add(Ipripng_rt *rrt, const struct in6_addr *gw, struct ifc *ifcp){ struct netinfo6 *np; Ip_u8 buffer[IP_BUFSIZ], buf1[IP_INET6_ADDRSTRLEN], buf2[IP_INET6_ADDRSTRLEN]; struct Ipnet_rt_msghdr *rtm; struct Ip_sockaddr_in6 *sin; int len; char buf3[IP_INET6_ADDRSTRLEN]; Ip_fd ripng_rtsock; np = &rrt->rrt_info; if (ipcom_inet_ntop(IP_AF_INET6, (void *)gw, (char *)buf1, sizeof(buf1)) == IP_NULL) buf1[0] = '\0'; /* So doesn't display garbage */ if (ipcom_inet_ntop(IP_AF_INET6, (void *)&ifcp->ifc_mylladdr, (char *)buf2, sizeof(buf2)) == IP_NULL) buf2[0] = '\0'; /* So doesn't display garbage */ if (ipcom_inet_ntop(IP_AF_INET6, &(np->rip6_dest), buf3, sizeof (buf3)) == IP_NULL) buf3[0] = '\0'; /* So doesn't display garbage */ IPCOM_LOG5(INFO, "ADD: %s/%d gw %s [%d] ifa %s", buf3, np->rip6_plen, buf1, np->rip6_metric - 1, buf2); if (ipripng_nflag()) return 0; memset(buffer, 0, sizeof(buffer)); rtm = (struct Ipnet_rt_msghdr *)buffer; rtm->rtm_type = IPNET_RTM_ADD; rtm->rtm_version = IPNET_RTM_VERSION; rtm->rtm_seq = ++priv_ripng_seq; rtm->rtm_pid = ipcom_getpid(); rtm->rtm_flags = rrt->rrt_flags; if ((rtm->rtm_flags & IPNET_RTF_HOST) == 0) rtm->rtm_addrs = IPNET_RTA_DST | IPNET_RTA_GATEWAY | IPNET_RTA_NETMASK; else rtm->rtm_addrs = IPNET_RTA_DST | IPNET_RTA_GATEWAY; rtm->rtm_rmx.rmx_hopcount = np->rip6_metric - 1; rtm->rtm_inits = IPNET_RTV_HOPCOUNT; sin = (struct Ip_sockaddr_in6 *)&buffer[sizeof(struct Ipnet_rt_msghdr)]; /* Destination */ sin->sin6_len = sizeof(struct Ip_sockaddr_in6); sin->sin6_family = IP_AF_INET6; sin->sin6_addr = np->rip6_dest; RT_PROTO_SET (sin, M2_ipRouteProto_rip); TOS_SET (sin, 0); sin = (struct Ip_sockaddr_in6 *)((char *)sin + ROUNDUP(sin->sin6_len)); /* Gateway */ sin->sin6_len = sizeof(struct Ip_sockaddr_in6); sin->sin6_family = IP_AF_INET6; sin->sin6_addr = *gw; sin = (struct Ip_sockaddr_in6 *)((char *)sin + ROUNDUP(sin->sin6_len)); if ((rtm->rtm_flags & IPNET_RTF_HOST) == 0) { /* Netmask */ sin->sin6_len = sizeof(struct Ip_sockaddr_in6); sin->sin6_family = IP_AF_INET6; sin->sin6_addr = *(plen2mask(np->rip6_plen)); sin = (struct Ip_sockaddr_in6 *)((char *)sin + ROUNDUP(sin->sin6_len)); } len = (char *)sin - (char *)buffer; rtm->rtm_msglen = len; ripng_rtsock = ipripng_rtsocket(); if (ipcom_socketwrite(ripng_rtsock, (char *)buffer, len) > 0) return IPCOM_SUCCESS; if (ipcom_errno == IP_ERRNO_EEXIST) { IPCOM_LOG3(WARNING, "ADD: Route already exists %s/%d gw %s", buf3, np->rip6_plen, buf1); } else { IPCOM_LOG1(WARNING, "Can not write to ripng_rtsock (addroute): %s", ipcom_strerror(ipcom_errno)); } return IPCOM_ERR_FAILED;}/* *=========================================================================== * ipripng_rtsock_del *=========================================================================== * Description: * Parameters: * Returns: * */IP_STATIC Ip_erripripng_rtsock_del(struct netinfo6 *np, const struct in6_addr *gw, Ip_bool proto_set){ Ip_u8 buf[IP_BUFSIZ], buf2[IP_INET6_ADDRSTRLEN]; struct Ipnet_rt_msghdr *rtm; struct Ip_sockaddr_in6 *sin; int len; char buf3[IP_INET6_ADDRSTRLEN]; Ip_fd ripng_rtsock; if (ipcom_inet_ntop(IP_AF_INET6, (void *)gw, (char *)buf2, sizeof(buf2)) == IP_NULL) buf2[0] = '\0'; /* So doesn't display garbage */ if (ipcom_inet_ntop(IP_AF_INET6, &np->rip6_dest, buf3, sizeof (buf3)) == IP_NULL) buf3[0] = '\0'; /* So doesn't display garbage */ IPCOM_LOG3(INFO, "DEL: %s/%d gw %s", buf3, np->rip6_plen, buf2); if (ipripng_nflag()) return 0; memset(buf, 0, sizeof(buf)); rtm = (struct Ipnet_rt_msghdr *)buf; rtm->rtm_type = IPNET_RTM_DELETE; rtm->rtm_version = IPNET_RTM_VERSION; rtm->rtm_seq = ++priv_ripng_seq; rtm->rtm_pid = ipcom_getpid(); rtm->rtm_flags = IPNET_RTF_UP | IPNET_RTF_GATEWAY; if (np->rip6_plen == sizeof(struct in6_addr) * 8) { rtm->rtm_flags |= IPNET_RTF_HOST; rtm->rtm_addrs = IPNET_RTA_DST | IPNET_RTA_GATEWAY; } else rtm->rtm_addrs = IPNET_RTA_DST | IPNET_RTA_GATEWAY | IPNET_RTA_NETMASK; sin = (struct Ip_sockaddr_in6 *)&buf[sizeof(struct Ipnet_rt_msghdr)]; /* Destination */ sin->sin6_len = sizeof(struct Ip_sockaddr_in6); sin->sin6_family = IP_AF_INET6; sin->sin6_addr = np->rip6_dest; if (proto_set) { RT_PROTO_SET (sin, M2_ipRouteProto_rip); TOS_SET (sin, 0); } sin = (struct Ip_sockaddr_in6 *)((char *)sin + ROUNDUP(sin->sin6_len)); /* Gateway */ sin->sin6_len = sizeof(struct Ip_sockaddr_in6); sin->sin6_family = IP_AF_INET6; sin->sin6_addr = *gw; sin = (struct Ip_sockaddr_in6 *)((char *)sin + ROUNDUP(sin->sin6_len)); if ((rtm->rtm_flags & IPNET_RTF_HOST) == 0) { /* Netmask */ sin->sin6_len = sizeof(struct Ip_sockaddr_in6); sin->sin6_family = IP_AF_INET6; sin->sin6_addr = *(plen2mask(np->rip6_plen)); sin = (struct Ip_sockaddr_in6 *)((char *)sin + ROUNDUP(sin->sin6_len)); } len = (char *)sin - (char *)buf; rtm->rtm_msglen = len; ripng_rtsock = ipripng_rtsocket(); if (ipcom_socketwrite(ripng_rtsock, (char *)buf, len) >= 0) return IPCOM_SUCCESS; if (ipcom_errno == IP_ERRNO_ESRCH) { IPCOM_LOG3(WARNING, "RTDEL: Route does not exist: %s/%d gw %s", buf3, np->rip6_plen, buf2); } else { IPCOM_LOG1(WARNING, "Can not write to ripng_rtsock (delroute): %s", ipcom_strerror(ipcom_errno)); } return IPCOM_ERR_FAILED;}/* *=========================================================================== * iprip_add_route_rtsock *=========================================================================== * Description: * Parameters: * Returns: * */IP_STATIC Ip_erripripng_add_route_rtsock(Ipripng_rt *rrt, const struct in6_addr *gw, struct ifc *ifcp){ return ipripng_rtsock_add(rrt, gw, ifcp);}/* *=========================================================================== * ipripng_delete_route_rtsock *=========================================================================== * Description: * Parameters: * Returns: * */IP_STATIC Ip_erripripng_delete_route_rtsock(struct netinfo6 *np, const struct in6_addr *gw, Ip_bool proto_set){ return ipripng_rtsock_del(np, gw, proto_set);}/* *=========================================================================== * ipripng_write *=========================================================================== * Description: * Parameters: * Returns: * */IP_STATIC Ip_erripripng_write(Ip_fd udp_fd, void *cookie, Ip_u32 ipaddr_n, Ipcom_sock_addr *dest, void *buf, Ip_size_t len){ (void)cookie; /* success. */ return 0;}/* *=========================================================================== * ipripngd *=========================================================================== * Description: RIPng daemon * Parameters: * Returns: * */IPCOM_PROCESS(ipripngd){ Ip_err ret; Ipripng_open conf; struct ifc *ifcp; Ip_bool ipripng_init_ok = IP_FALSE; Ip_bool ipripng_open_ok = IP_FALSE; Ip_u32 num, max; Ip_fd udp_fd = IP_INVALID_SOCKET; Ip_fd rt_fd = IP_INVALID_SOCKET; Ip_fd_set read_set, fds; Ip_fd ipd_fd = IP_INVALID_SOCKET; struct Ip_timeval tv, *ptv = IP_NULL; ipcom_proc_init(); IPCOM_LOG0(INFO, "ipripngd :: starting"); daemon_started = IP_TRUE; ripngStopFlag = IP_FALSE;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -