LinuxÒÁµéÔ°ÂÛ̳'s Archiver

liwang820716 ·¢±íÓÚ 2007-4-26 16:52

netlinkÇó¾È£¡

ÓÃnetlink¶ÁÈ¡Äں˷ÓÉ±í²¢ÏÔʾ³öÀ´µÄʱºò£¬¶Áµ½µÄmetricµÄÖµ×ÜÊÇΪÁ㣬²»ÖªµÀΪʲô£¬Çë¸÷λ´óÏÀÖ¸µã¡£¾ßÌåµÄº¯ÊýƬ¶ÏÈçÏ£º-j4J+D P*_1[

R,D1JXp(p struct route* get_route(struct nlmsghdr *nlmsghdr)!^q2Fma[d+G;q
{
X4Hk xC         struct rtattr *rta;
+u+[ N^xk         int len;
8M)^'}H7Sb1l 6CKs8mZIK/b0^
        struct route *route;
1L-K@$?4wFf         if ((route = malloc(sizeof(struct route))) == NULL)
7@"rg{r         {:h.x8N9t @
#ifdef DEBUG_NETLINK3v`#Vo}Z v
                perror("Insufficient memory allocating route error!"[IMG]http://www.linuxc.net/images/smilies/wink.gif[/IMG];
q3vM(PS z #endif
t;v l9bI*t                 return NULL;)TM8qv&H k)rA
        })O\.@$}0B5fbYe4|
         FED9Dd(C)f,IY
        memset(route, 0, sizeof(struct route));
'[%gv@q},M
p XDm&txv         len = nlmsghdr->nlmsg_len - NLMSG_LENGTH(sizeof(struct rtmsg));
H!u]8oY2G%b5yLi BOwa/b!Vg
        /** NLMSG_DATA(nlmsghdr) return the rtmsg pointer following, and RTM_RTA return MM?1A@^
                the rtattr pointer following the rtmsg.        **//P0J#`ah/p
        rta = RTM_RTA(NLMSG_DATA(nlmsghdr));+P0p mv)\ n-Dd
        while (RTA_OK(rta, len))
8X K,bA7h+QG         {               
W-RB ^v ve                 if (rta->rta_type >= RTA_MAX)7h|Ue Mz
                {
s|1U0m)KM                         break;}H`#K K7Yio
                }XFd`[

g7L?zJw                 /** get the dst address **/
H8?%L;B {@\}(lE                 if(rta->rta_type == RTA_DST)(uJs*c9U!^ \+q-w
                {8VwAgA3T
                        route->dst = *(struct in_addr *)(RTA_DATA(rta));W-o$Z$JP
                }"Q X"jgl(] RFL
               
'J:Z4~%M\P                 /** get the nexthop address **/9e f+]uE
                if(rta->rta_type == RTA_GATEWAY)
F'X/[.[DlcWk                 {
+u a6h&|8A R                         route->nexthop = *(struct in_addr *)(RTA_DATA(rta));
!D*j-?%~3Wc                 }
B)O5Avd{NM                 ~ `(nTfKk
                /** get the metric **/
BQd^x/D$[Y*\^                 if(rta->rta_type == RTA_METRICS)8ENN1I k kW
                {9Un)WC$ZU6H
                        route->metric = *(int *)RTA_DATA(rta);
E9M uz9z8]                 }
0Ay$A.Y(j5_ |5\b`2J
(zmk-Y*WsFhP                 rta = RTA_NEXT(rta, len);
"mj6P q6p-J %J?*\0ZRw K&Z)xo
        }d-{[)d$V#Qb
        return route;CP7L/~{[!Q
}
jCI8\\$B$f :V@h1juqjW
СµÜ¸Ð¼¤²»¾¡£¡

flag ·¢±íÓÚ 2007-4-30 10:49

²»ÖªµÀÄãÒª¸Éʲô£¬ÓÃNETLINK²»ÊÇÒª½¨SOCKETÈ»ºó·¢°üÂð£¿

Ò³: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.