本文整理汇总了C++中RTM_RTA函数的典型用法代码示例。如果您正苦于以下问题:C++ RTM_RTA函数的具体用法?C++ RTM_RTA怎么用?C++ RTM_RTA使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了RTM_RTA函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: flush_addrlabel
static int flush_addrlabel(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
{
struct rtnl_handle rth2;
struct rtmsg *r = NLMSG_DATA(n);
int len = n->nlmsg_len;
struct rtattr * tb[IFAL_MAX+1];
len -= NLMSG_LENGTH(sizeof(*r));
if (len < 0)
return -1;
parse_rtattr(tb, IFAL_MAX, RTM_RTA(r), len);
if (tb[IFAL_ADDRESS]) {
n->nlmsg_type = RTM_DELADDRLABEL;
n->nlmsg_flags = NLM_F_REQUEST;
if (rtnl_open(&rth2, 0) < 0)
return -1;
if (rtnl_talk(&rth2, n, NULL, 0) < 0)
return -2;
rtnl_close(&rth2);
}
return 0;
}
开发者ID:Distrotech,项目名称:iproute2,代码行数:28,代码来源:ipaddrlabel.c
示例2: rule_flush_table_range_filter
/*
* rule_flush_table_range_filter: rtnl_dump filter for
* rule_flush_table_range() (see below)
*/
int
rule_flush_table_range_filter(const struct sockaddr_nl *who,
struct nlmsghdr *n, void *arg)
{
struct rtnl_handle rth2;
struct rtmsg *r = NLMSG_DATA(n);
int len = n->nlmsg_len;
struct rtattr *tb[RTA_MAX + 1];
u_int a = *(u_int *) arg;
u_int b = *((u_int *) arg + 1);
len -= NLMSG_LENGTH(sizeof(*r));
if (len < 0)
return -1;
parse_rtattr(tb, RTA_MAX, RTM_RTA(r), len);
if (tb[RTA_PRIORITY] && (r->rtm_table >= a && r->rtm_table <= b)) {
n->nlmsg_type = RTM_DELRULE;
n->nlmsg_flags = NLM_F_REQUEST;
if (rtnl_open(&rth2, 0) < 0)
return -1;
if (rtnl_talk(&rth2, n, 0, 0, NULL, NULL, NULL) < 0)
return -2;
rtnl_close(&rth2);
}
return 0;
}
开发者ID:Netsukuku,项目名称:netsukuku,代码行数:36,代码来源:krnl_rule.c
示例3: parseRoutes
static void parseRoutes(struct nlmsghdr *nlHdr, struct route_info *rtInfo) {
struct rtmsg *rtMsg = (struct rtmsg *)NLMSG_DATA(nlHdr);
if ((rtMsg->rtm_family != AF_INET) || (rtMsg->rtm_table != RT_TABLE_MAIN))
return;
struct rtattr *rtAttr = (struct rtattr *)RTM_RTA(rtMsg);
int rtLen = RTM_PAYLOAD(nlHdr);
for (; RTA_OK(rtAttr, rtLen); rtAttr = RTA_NEXT(rtAttr, rtLen)) {
switch (rtAttr->rta_type) {
case RTA_OIF:
if_indextoname(*(int *)RTA_DATA(rtAttr), rtInfo->ifName);
break;
case RTA_GATEWAY:
rtInfo->gateWay = *(in_addr *)RTA_DATA(rtAttr);
break;
case RTA_PREFSRC:
rtInfo->srcAddr = *(in_addr *)RTA_DATA(rtAttr);
break;
case RTA_DST:
rtInfo->dstAddr = *(in_addr *)RTA_DATA(rtAttr);
break;
}
}
}
开发者ID:xen0n,项目名称:cernetkit,代码行数:25,代码来源:networkhelperimpllinux.cpp
示例4: NLMSG_DATA
bool route_table_mgr::parse_enrty(nlmsghdr *nl_header, route_val *p_val)
{
int len;
struct rtmsg *rt_msg;
struct rtattr *rt_attribute;
// get route entry header
rt_msg = (struct rtmsg *) NLMSG_DATA(nl_header);
// we are not concerned about the local and default route table
if (rt_msg->rtm_family != AF_INET || rt_msg->rtm_table == RT_TABLE_LOCAL || rt_msg->rtm_table == RT_TABLE_DEFAULT)
return false;
p_val->set_protocol(rt_msg->rtm_protocol);
p_val->set_scope(rt_msg->rtm_scope);
p_val->set_type(rt_msg->rtm_type);
p_val->set_table_id(rt_msg->rtm_table);
in_addr_t dst_mask = htonl(VMA_NETMASK(rt_msg->rtm_dst_len));
p_val->set_dst_mask(dst_mask);
p_val->set_dst_pref_len(rt_msg->rtm_dst_len);
len = RTM_PAYLOAD(nl_header);
rt_attribute = (struct rtattr *) RTM_RTA(rt_msg);
for (;RTA_OK(rt_attribute, len);rt_attribute=RTA_NEXT(rt_attribute,len)) {
parse_attr(rt_attribute, p_val);
}
p_val->set_state(true);
p_val->set_str();
return true;
}
开发者ID:alantsev,项目名称:libvma,代码行数:32,代码来源:route_table_mgr.cpp
示例5: resolve_mac_from_cache_parse
static int resolve_mac_from_cache_parse(struct ndmsg *ndmsg, size_t len_payload,
struct ether_addr *mac_addr,
uint8_t *l3addr,
size_t l3_len)
{
int l3found, llfound;
struct rtattr *rtattr;
struct ether_addr mac_empty;
l3found = 0;
llfound = 0;
memset(&mac_empty, 0, sizeof(mac_empty));
for (rtattr = RTM_RTA(ndmsg); RTA_OK(rtattr, len_payload);
rtattr = RTA_NEXT(rtattr, len_payload)) {
switch (rtattr->rta_type) {
case NDA_DST:
memcpy(l3addr, RTA_DATA(rtattr), l3_len);
l3found = 1;
break;
case NDA_LLADDR:
memcpy(mac_addr, RTA_DATA(rtattr), ETH_ALEN);
if (memcmp(mac_addr, &mac_empty,
sizeof(mac_empty)) == 0)
llfound = 0;
else
llfound = 1;
break;
}
}
return l3found && llfound;
}
开发者ID:hunghtbk,项目名称:batman-shell,代码行数:33,代码来源:functions.c
示例6: flush_rule
static int flush_rule(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
{
struct rtnl_handle rth2;
struct rtmsg *r = NLMSG_DATA(n);
int len = n->nlmsg_len;
struct rtattr * tb[FRA_MAX+1];
len -= NLMSG_LENGTH(sizeof(*r));
if (len < 0)
return -1;
parse_rtattr(tb, FRA_MAX, RTM_RTA(r), len);
if (tb[FRA_PRIORITY]) {
n->nlmsg_type = RTM_DELRULE;
n->nlmsg_flags = NLM_F_REQUEST;
if (rtnl_open(&rth2, 0) < 0)
return -1;
if (rtnl_talk(&rth2, n, 0, 0, NULL) < 0)
return -2;
rtnl_close(&rth2);
}
return 0;
}
开发者ID:dtaht,项目名称:deBloat-iproute2,代码行数:28,代码来源:iprule.c
示例7: netlink_query_add
/*
* Add RTA_SRC or RTA_DST attribute to netlink query message.
*/
void netlink_query_add(char *msgbuf, int rta_type, ip_address *addr)
{
struct nlmsghdr *nlmsg;
struct rtmsg *rtmsg;
struct rtattr *rtattr;
int len, rtlen;
void *p;
nlmsg = (struct nlmsghdr *)msgbuf;
rtmsg = (struct rtmsg *)NLMSG_DATA(nlmsg);
/* Find first empty attribute slot */
rtlen = RTM_PAYLOAD(nlmsg);
rtattr = (struct rtattr *)RTM_RTA(rtmsg);
while (RTA_OK(rtattr, rtlen))
rtattr = RTA_NEXT(rtattr, rtlen);
/* Add attribute */
if (rtmsg->rtm_family == AF_INET) {
len = 4;
p = (void*)&addr->u.v4.sin_addr.s_addr;
} else {
len = 16;
p = (void*)addr->u.v6.sin6_addr.s6_addr;
}
rtattr->rta_type = rta_type;
rtattr->rta_len = sizeof(struct rtattr) + len; /* bytes */
memmove(RTA_DATA(rtattr), p, len);
if (rta_type == RTA_SRC)
rtmsg->rtm_src_len = len * 8; /* bits */
else
rtmsg->rtm_dst_len = len * 8;
nlmsg->nlmsg_len += rtattr->rta_len;
}
开发者ID:st3fan,项目名称:libreswan,代码行数:37,代码来源:addconn.c
示例8: getmsg
static int
getmsg(struct rtmsg *rtm, int msglen, struct rpfctl *rpf)
{
mifi_t vifi;
struct uvif *v;
struct rtattr *rta[RTA_MAX + 1];
if (rtm->rtm_type == RTN_LOCAL) {
/* tracef(TRF_NETLINK, "NETLINK: local address"); */
log_msg(LOG_DEBUG, 0, "NETLINK: local address");
if ((rpf->iif = local_address(&rpf->source)) != MAXMIFS) {
rpf->rpfneighbor = rpf->source;
return TRUE;
}
return FALSE;
}
memset(&rpf->rpfneighbor, 0, sizeof(rpf->rpfneighbor)); /* initialized */
if (rtm->rtm_type != RTN_UNICAST) {
/* tracef(TRF_NETLINK, "NETLINK: route type is %d", rtm->rtm_type); */
log_msg(LOG_DEBUG, 0, "NETLINK: route type is %d", rtm->rtm_type);
return FALSE;
}
memset(rta, 0, sizeof(rta));
parse_rtattr(rta, RTA_MAX, RTM_RTA(rtm), msglen - sizeof(*rtm));
if (rta[RTA_OIF]) {
int ifindex = *(int *) RTA_DATA(rta[RTA_OIF]);
for (vifi = 0, v = uvifs; vifi < numvifs; ++vifi, ++v) {
if (v->uv_ifindex == ifindex)
break;
}
if (vifi >= numvifs) {
log_msg(LOG_WARNING, 0, "NETLINK: ifindex=%d, but no vif", ifindex);
return FALSE;
}
/* tracef(TRF_NETLINK, "NETLINK: vif %d, ifindex=%d", vifi, ifindex);*/
log_msg(LOG_DEBUG, 0, "NETLINK: vif %d, ifindex=%d", vifi, ifindex);
} else {
log_msg(LOG_WARNING, 0, "NETLINK: no interface");
return FALSE;
}
if (rta[RTA_GATEWAY]) {
struct in6_addr gw;
memcpy(&gw,RTA_DATA(rta[RTA_GATEWAY]),sizeof(gw));
/* __u32 gw = *(__u32 *) RTA_DATA(rta[RTA_GATEWAY]); */
/* tracef(TRF_NETLINK, "NETLINK: gateway is %s", inet6_fmt(gw)); */
log_msg(LOG_DEBUG, 0, "NETLINK: gateway is %s", inet6_fmt(&gw));
init_sin6(&rpf->rpfneighbor);
rpf->rpfneighbor.sin6_addr = gw;
rpf->rpfneighbor.sin6_scope_id = v->uv_ifindex;
} else
rpf->rpfneighbor = rpf->source;
rpf->iif = vifi;
return TRUE;
}
开发者ID:Balaji-Parasuram,项目名称:mcast-tools,代码行数:59,代码来源:netlink.c
示例9: get_default_gw
// gw and iface[IF_NAMESIZE] MUST be allocated
int get_default_gw(struct in_addr *gw, char *iface)
{
struct rtmsg req;
unsigned int nl_len;
char buf[8192];
struct nlmsghdr *nlhdr;
if (!gw || !iface) {
return -1;
}
// Send RTM_GETROUTE request
memset(&req, 0, sizeof(req));
int sock = send_nl_req(RTM_GETROUTE, 0, &req, sizeof(req));
// Read responses
nl_len = read_nl_sock(sock, buf, sizeof(buf));
if (nl_len <= 0) {
return -1;
}
// Parse responses
nlhdr = (struct nlmsghdr *)buf;
while (NLMSG_OK(nlhdr, nl_len)) {
struct rtattr *rt_attr;
struct rtmsg *rt_msg;
int rt_len;
int has_gw = 0;
rt_msg = (struct rtmsg *) NLMSG_DATA(nlhdr);
if ((rt_msg->rtm_family != AF_INET) || (rt_msg->rtm_table != RT_TABLE_MAIN)) {
return -1;
}
rt_attr = (struct rtattr *) RTM_RTA(rt_msg);
rt_len = RTM_PAYLOAD(nlhdr);
while (RTA_OK(rt_attr, rt_len)) {
switch (rt_attr->rta_type) {
case RTA_OIF:
if_indextoname(*(int *) RTA_DATA(rt_attr), iface);
break;
case RTA_GATEWAY:
gw->s_addr = *(unsigned int *) RTA_DATA(rt_attr);
has_gw = 1;
break;
}
rt_attr = RTA_NEXT(rt_attr, rt_len);
}
if (has_gw) {
return 0;
}
nlhdr = NLMSG_NEXT(nlhdr, nl_len);
}
return -1;
}
开发者ID:astridliu,项目名称:zmap,代码行数:58,代码来源:get_gateway.c
示例10: handle_route_msg
static int handle_route_msg(struct nlmsghdr *nlh, int n)
{
struct rtmsg *rtm = NLMSG_DATA(nlh);
struct rtattr *tb[RTN_MAX];
parse_rt_attrs(tb, RTN_MAX, RTM_RTA(rtm), RTM_PAYLOAD(nlh));
handle_route_attrs(rtm, tb, nlh->nlmsg_type);
return 0;
}
开发者ID:alfmatos,项目名称:neteventd,代码行数:10,代码来源:rtnl.c
示例11: handle_neigh_msg
static int handle_neigh_msg(struct nlmsghdr *nlh, int n)
{
struct rtattr *tb[NDA_MAX];
struct ndmsg *ndm = NLMSG_DATA(nlh);
parse_rt_attrs(tb, NDA_MAX, RTM_RTA(ndm), RTM_PAYLOAD(nlh));
handle_neigh_attrs(ndm, tb, nlh->nlmsg_type);
return 0;
}
开发者ID:alfmatos,项目名称:neteventd,代码行数:10,代码来源:rtnl.c
示例12: read_reply
int read_reply()
{
//string to hold content of the route
// table (i.e. one entry)
char dsts[24], gws[24], ifs[16], ms[24];
// outer loop: loops thru all the NETLINK
// headers that also include the route entry
// header
nlp = (struct nlmsghdr *) buf;
for(; NLMSG_OK(nlp, nll); nlp = NLMSG_NEXT(nlp, nll))
{
// get route entry header
rtp = (struct rtmsg *) NLMSG_DATA(nlp);
// we are only concerned about the
// main route table
if(rtp->rtm_table != RT_TABLE_MAIN)
continue;
// init all the strings
bzero(dsts, sizeof(dsts));
bzero(gws, sizeof(gws));
bzero(ifs, sizeof(ifs));
bzero(ms, sizeof(ms));
// inner loop: loop thru all the attributes of
// one route entry
rtap = (struct rtattr *) RTM_RTA(rtp);
rtl = RTM_PAYLOAD(nlp);
for( ; RTA_OK(rtap, rtl); rtap = RTA_NEXT(rtap,rtl))
{
switch(rtap->rta_type)
{
// destination IPv4 address
case RTA_DST:
inet_ntop(AF_INET, RTA_DATA(rtap),
dsts, 24);
break;
// next hop IPv4 address
case RTA_GATEWAY:
inet_ntop(AF_INET, RTA_DATA(rtap),
gws, 24);
break;
// unique ID associated with the network
// interface
case RTA_OIF:
sprintf(ifs, "%d",
*((int *) RTA_DATA(rtap)));
default:
break;
}
}
sprintf(ms, "%d", rtp->rtm_dst_len);
test_msg("dst %s/%s gw %s if %s\n",
dsts, ms, gws, ifs);
}
return 0;
}
开发者ID:0x7f454c46,项目名称:criu-1,代码行数:55,代码来源:netlink00.c
示例13: test_route
static void test_route(void) {
_cleanup_rtnl_message_unref_ sd_rtnl_message *req;
struct in_addr addr;
uint32_t index = 2;
uint16_t type;
void *data;
uint32_t u32_data;
int r;
struct rtmsg *rtm;
r = sd_rtnl_message_new_route(NULL, &req, RTM_NEWROUTE, AF_INET);
if (r < 0) {
log_error("Could not create RTM_NEWROUTE message: %s", strerror(-r));
return;
}
addr.s_addr = htonl(INADDR_LOOPBACK);
r = sd_rtnl_message_append_in_addr(req, RTA_GATEWAY, &addr);
if (r < 0) {
log_error("Could not append RTA_GATEWAY attribute: %s", strerror(-r));
return;
}
r = sd_rtnl_message_append_u32(req, RTA_OIF, index);
if (r < 0) {
log_error("Could not append RTA_OIF attribute: %s", strerror(-r));
return;
}
assert_se(rtnl_message_seal(NULL, req) >= 0);
assert_se(sd_rtnl_message_read(req, &type, &data) > 0);
assert_se(type == RTA_GATEWAY);
assert_se(((struct in_addr *)data)->s_addr == addr.s_addr);
assert_se(sd_rtnl_message_read(req, &type, &data) > 0);
assert_se(type == RTA_OIF);
assert_se(*(uint32_t *) data == index);
rtm = NLMSG_DATA(req->hdr);
r = rtnl_message_parse(req,
&req->rta_offset_tb,
&req->rta_tb_size,
RTA_MAX,
RTM_RTA(rtm),
RTM_PAYLOAD(req->hdr));
assert_se(sd_rtnl_message_read_u32(req, RTA_GATEWAY, &u32_data) == 0);
assert_se(sd_rtnl_message_read_u32(req, RTA_OIF, &u32_data) == 0);
assert_se((req = sd_rtnl_message_unref(req)) == NULL);
}
开发者ID:MOBO-OSS,项目名称:systemd-relative,代码行数:53,代码来源:test-rtnl.c
示例14: switch
struct ip4_routing_table *parse_nlmsg(struct nlmsghdr *msg) {
char dst_temp[IP4_ALEN];
char gw_temp[IP4_ALEN];
uint32_t priority;
uint32_t interface;
struct ip4_routing_table *table_pointer = NULL;
switch (msg->nlmsg_type) {
case NLMSG_ERROR: {
struct nlmsgerr* errorMsg = (struct nlmsgerr*) NLMSG_DATA(msg);
PRINT_DEBUG("recvd NLMSG_ERROR error seq:%d code:%d...", msg->nlmsg_seq, errorMsg->error);
break;
}
case RTM_NEWROUTE: {
struct rtmsg* rtm = (struct rtmsg*) NLMSG_DATA(msg);
struct rtattr* rta = RTM_RTA(rtm);
int rtaLen = msg->nlmsg_len - NLMSG_LENGTH(sizeof(struct rtmsg));
if (rtm->rtm_type == RTN_UNICAST) // don't consider local, broadcast and unreachable routes
{
table_pointer = (struct ip4_routing_table*) secure_malloc(sizeof(struct ip4_routing_table));
for (; RTA_OK(rta, rtaLen); rta = RTA_NEXT(rta, rtaLen)) {
switch (rta->rta_type) {
case RTA_DST: //destination
table_pointer->mask = rtm->rtm_dst_len;
memcpy(dst_temp, RTA_DATA(rta), IP4_ALEN);
//PRINT_DEBUG("received RTA_DST");
PRINT_DEBUG("dst_str = %u.%u.%u.%u", dst_temp[0] & 0xFF, dst_temp[1] & 0xFF, dst_temp[2] & 0xFF, dst_temp[3] & 0xFF);
table_pointer->dst = IP4_ADR_P2H(dst_temp[0]&0xFF, dst_temp[1]&0xFF, dst_temp[2]&0xFF, dst_temp[3]&0xFF);
break;
case RTA_GATEWAY: //next hop
table_pointer->mask = rtm->rtm_dst_len;
memcpy(gw_temp, RTA_DATA(rta), IP4_ALEN);
//PRINT_DEBUG("received RTA_GATEWAY");
PRINT_DEBUG("gw_str = %u.%u.%u.%u", gw_temp[0] & 0xFF, gw_temp[1] & 0xFF, gw_temp[2] & 0xFF, gw_temp[3] & 0xFF);
table_pointer->gw = IP4_ADR_P2H(gw_temp[0]&0xFF, gw_temp[1]&0xFF, gw_temp[2]&0xFF, gw_temp[3]&0xFF);
break;
case RTA_OIF: //interface
memcpy(&table_pointer->interface, RTA_DATA(rta), sizeof(interface)); //TODO won't work with current hack
PRINT_DEBUG("interface:%u", table_pointer->interface);
break;
case RTA_PRIORITY: //metric
memcpy(&table_pointer->metric, RTA_DATA(rta), sizeof(priority));
PRINT_DEBUG("metric:%u", table_pointer->metric);
break;
} //switch(rta->)
} // for()
} // if RTN_UNICAST
return (table_pointer);
}
} //switch (msg->nlmsg_type)
return (NULL);
}
开发者ID:jiangxianliang,项目名称:FINS-Framework,代码行数:52,代码来源:IP4_route_info.c
示例15: parseRoutes
/* For parsing the route info returned */
static int parseRoutes(const char* ifName, struct nlmsghdr *nlHdr, struct route_info *rtInfo)
{
struct rtmsg *rtMsg;
struct rtattr *rtAttr;
int rtLen;
int i_ret = ZQERROR;
rtMsg = (struct rtmsg *)NLMSG_DATA(nlHdr);
/* If the route is not for AF_INET or does not belong to main routing table
then return. */
if((rtMsg->rtm_family != AF_INET) || (rtMsg->rtm_table != RT_TABLE_MAIN))
{
///NOTE , free must be called , otherwise memory leak will occur
goto ExitPoint;
}
/* get the rtattr field */
rtAttr = (struct rtattr *)RTM_RTA(rtMsg);
rtLen = RTM_PAYLOAD(nlHdr);
for(;RTA_OK(rtAttr,rtLen);rtAttr = RTA_NEXT(rtAttr,rtLen))
{
switch(rtAttr->rta_type)
{
case RTA_OIF:
if_indextoname(*(int *)RTA_DATA(rtAttr), rtInfo->ifName);
break;
case RTA_GATEWAY:
rtInfo->gateWay = *(u_int *)RTA_DATA(rtAttr);
break;
case RTA_PREFSRC:
rtInfo->srcAddr = *(u_int *)RTA_DATA(rtAttr);
break;
case RTA_DST:
rtInfo->dstAddr = *(u_int *)RTA_DATA(rtAttr);
break;
}
}
struct in_addr* p_dstAddr = (struct in_addr*)&rtInfo->dstAddr;
struct in_addr* p_gateWay = (struct in_addr*)&rtInfo->gateWay;
if ( !strcmp( ifName, rtInfo->ifName ) &&
strstr((char *)inet_ntoa(*p_dstAddr), "0.0.0.0"))
{
sprintf(gateway, (char *)inet_ntoa(*p_gateWay));
i_ret = ZQSUCCESS;
}
ExitPoint:
return i_ret;
}
开发者ID:jamesyan84,项目名称:zbase,代码行数:52,代码来源:znetwork.c
示例16: get_default_route_cb
/* function: get_default_route_cb
* finds the default route with the request family and out interface and saves the gateway
* msg - netlink message
* data - (struct default_route_data) requested filters and response storage
*/
static int get_default_route_cb(struct nl_msg *msg, void *data) {
struct rtmsg *rt_p;
struct rtattr *rta_p;
int rta_len;
struct default_route_data *default_route = data;
union anyip *this_gateway = NULL;
ssize_t this_gateway_size;
int this_interface_id = -1;
if(default_route->reply_found_route) { // we already found our route
return NL_OK;
}
rt_p = (struct rtmsg *)nlmsg_data(nlmsg_hdr(msg));
if(rt_p->rtm_dst_len != 0) { // not a default route
return NL_OK;
}
if((rt_p->rtm_family != default_route->request_family) || (rt_p->rtm_table != RT_TABLE_MAIN)) { // not a route we care about
return NL_OK;
}
rta_p = (struct rtattr *)RTM_RTA(rt_p);
rta_len = RTM_PAYLOAD(nlmsg_hdr(msg));
for(; RTA_OK(rta_p, rta_len); rta_p = RTA_NEXT(rta_p, rta_len)) {
switch(rta_p->rta_type) {
case RTA_GATEWAY:
this_gateway = RTA_DATA(rta_p);
this_gateway_size = RTA_PAYLOAD(rta_p);
break;
case RTA_OIF:
this_interface_id = *(int *)RTA_DATA(rta_p);
break;
default:
break;
}
}
if(this_interface_id == default_route->request_interface_id) {
default_route->reply_found_route = 1;
if(this_gateway != NULL) {
memcpy(&default_route->reply_gateway, this_gateway, this_gateway_size);
default_route->reply_has_gateway = 1;
} else {
default_route->reply_has_gateway = 0;
}
}
return NL_OK;
}
开发者ID:samm-git,项目名称:e3372h-vendor-src,代码行数:53,代码来源:getroute.c
示例17: parseRoutes
void
parseRoutes (struct nlmsghdr *nlHdr, struct route_info *rtInfo, char *gateway)
{
struct rtmsg *rtMsg;
struct rtattr *rtAttr;
int rtLen;
char *tempBuf = NULL;
//2007-12-10
struct in_addr dst;
struct in_addr gate;
tempBuf = (char *)malloc (100);
rtMsg = (struct rtmsg *)NLMSG_DATA (nlHdr);
// If the route is not for AF_INET or does not belong to main routing table
//then return.
if ((rtMsg->rtm_family != AF_INET) || (rtMsg->rtm_table != RT_TABLE_MAIN)) {
free (tempBuf);
return;
}
/* get the rtattr field */
rtAttr = (struct rtattr *)RTM_RTA (rtMsg);
rtLen = RTM_PAYLOAD (nlHdr);
for (; RTA_OK (rtAttr, rtLen); rtAttr = RTA_NEXT (rtAttr, rtLen)) {
switch (rtAttr->rta_type) {
case RTA_OIF:
if_indextoname (*(int *)RTA_DATA (rtAttr), rtInfo->ifName);
break;
case RTA_GATEWAY:
rtInfo->gateWay = *(u_int *) RTA_DATA (rtAttr);
break;
case RTA_PREFSRC:
rtInfo->srcAddr = *(u_int *) RTA_DATA (rtAttr);
break;
case RTA_DST:
rtInfo->dstAddr = *(u_int *) RTA_DATA (rtAttr);
break;
}
}
//2007-12-10
dst.s_addr = rtInfo->dstAddr; /*lint !e632*/
if (strstr ((char *)inet_ntoa (dst), "0.0.0.0")) {
gate.s_addr = rtInfo->gateWay; /*lint !e632*/
sprintf (gateway, (char *)inet_ntoa (gate));
}
free (tempBuf);
return;
}
开发者ID:lwllovewf2010,项目名称:tr069,代码行数:47,代码来源:cfg_service.c
示例18: parse_route_msg
/*
* parse_route_msg
*/
int
parse_route_msg (netlink_msg_ctx_t *ctx)
{
int len;
struct rtattr **rtattrs, *rtattr, *gateway, *oif;
int if_index;
ctx->rtmsg = NLMSG_DATA(ctx->hdr);
len = ctx->hdr->nlmsg_len - NLMSG_LENGTH(sizeof(struct rtmsg));
if (len < 0) {
netlink_msg_ctx_set_err(ctx, "Bad message length");
return 0;
}
if (!parse_rtattrs(ctx, RTM_RTA(ctx->rtmsg), len)) {
return 0;
}
rtattrs = ctx->rtattrs;
ctx->dest = rtattrs[RTA_DST];
ctx->src = rtattrs[RTA_PREFSRC];
rtattr = rtattrs[RTA_PRIORITY];
if (rtattr) {
ctx->metric = (int *) RTA_DATA(rtattr);
}
gateway = rtattrs[RTA_GATEWAY];
oif = rtattrs[RTA_OIF];
if (gateway || oif) {
if_index = 0;
if (oif) {
if_index = *((int *) RTA_DATA(oif));
}
netlink_msg_ctx_add_nh(ctx, if_index, gateway);
}
rtattr = rtattrs[RTA_MULTIPATH];
if (rtattr) {
parse_multipath_attr(ctx, rtattr);
}
return 1;
}
开发者ID:ProyectoRRAP,项目名称:LiveCode,代码行数:49,代码来源:fpm_stub.c
示例19: netlink_parse_routes
/**
* Extract each route table entry and print
*/
static void netlink_parse_routes(struct rtmon_t *rtmon, char *b, int blen) {
struct nlmsghdr *hdr = (struct nlmsghdr *) b;
struct rtattr * attr;
struct rtmon_route rt;
int payload;
for(; NLMSG_OK(hdr, blen); hdr = NLMSG_NEXT(hdr, blen)) {
struct rtmsg * rtm = (struct rtmsg *) NLMSG_DATA(hdr);
if (rtm->rtm_table != RT_TABLE_MAIN)
continue;
attr = (struct rtattr *) RTM_RTA(rtm);
payload = RTM_PAYLOAD(hdr);
memset(&rt, 0, sizeof(rt));
for (;RTA_OK(attr, payload); attr = RTA_NEXT(attr, payload)) {
switch(attr->rta_type) {
case RTA_DST:
rt.destination = *(struct in_addr *)RTA_DATA(attr);
break;
case RTA_GATEWAY:
rt.gateway = *(struct in_addr *)RTA_DATA(attr);
break;
case RTA_OIF:
rt.if_index = *((int *) RTA_DATA(attr));
default:
break;
}
}
{
uint32_t mask = 0;
int i;
for (i=0; i<rtm->rtm_dst_len; i++) {
mask |= (1 << (32-i-1));
}
rt.netmask.s_addr = htonl(mask);
}
rtmon_add_route(rtmon, &rt);
}
}
开发者ID:Nazninn,项目名称:coova-chilli,代码行数:49,代码来源:rtmon.c
示例20: nl_route
static void nl_route(struct nlmsghdr *nlmsg)
{
struct rtmsg *r;
struct rtattr *a;
int la;
int gw = 0, dst = 0, mask = 0, idx = 0;
if (nlmsg->nlmsg_len < NLMSG_LENGTH(sizeof(struct rtmsg))) {
_e("Packet too small or truncated!");
return;
}
r = NLMSG_DATA(nlmsg);
a = RTM_RTA(r);
la = RTM_PAYLOAD(nlmsg);
while (RTA_OK(a, la)) {
void *data = RTA_DATA(a);
switch (a->rta_type) {
case RTA_GATEWAY:
gw = *((int *)data);
//_d("GW: 0x%04x", gw);
break;
case RTA_DST:
dst = *((int *)data);
mask = r->rtm_dst_len;
//_d("MASK: 0x%04x", mask);
break;
case RTA_OIF:
idx = *((int *)data);
//_d("IDX: 0x%04x", idx);
break;
}
a = RTA_NEXT(a, la);
}
if ((!dst && !mask) && (gw || idx)) {
if (nlmsg->nlmsg_type == RTM_DELROUTE)
cond_clear("net/route/default");
else
cond_set("net/route/default");
}
}
开发者ID:jonasj76,项目名称:finit,代码行数:45,代码来源:netlink.c
注:本文中的RTM_RTA函数示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论