Browse Source

[1540] Updates after review.

Tomek Mrugalski 13 years ago
parent
commit
795efe06b7
2 changed files with 17 additions and 15 deletions
  1. 1 1
      src/bin/dhcp6/dhcp6_srv.cc
  2. 16 14
      src/lib/dhcp/iface_mgr.cc

+ 1 - 1
src/bin/dhcp6/dhcp6_srv.cc

@@ -189,7 +189,7 @@ void Dhcpv6Srv::setServerID() {
         // some interfaces (like lo on Linux) report 6-bytes long
         // MAC adress 00:00:00:00:00:00. Let's not use such weird interfaces
         // to generate DUID.
-        if (!memcmp(iface->mac_, zeros, iface->mac_len_)) {
+        if (isRangeZero(iface->mac_, iface->mac_ + iface->mac_len_)) {
             continue;
         }
 

+ 16 - 14
src/lib/dhcp/iface_mgr.cc

@@ -533,11 +533,7 @@ const std::string & mcast) {
 
 bool
 IfaceMgr::send(const Pkt6Ptr& pkt) {
-    struct msghdr m;
-    struct iovec v;
     int result;
-    struct in6_pktinfo *pktinfo;
-    struct cmsghdr *cmsg;
 
     Iface* iface = getIface(pkt->getIface());
     if (!iface) {
@@ -547,8 +543,6 @@ IfaceMgr::send(const Pkt6Ptr& pkt) {
 
     memset(&control_buf_[0], 0, control_buf_len_);
 
-    // Initialize our message header structure.
-    memset(&m, 0, sizeof(m));
 
     // Set the target address we're sending to.
     sockaddr_in6 to;
@@ -560,6 +554,9 @@ IfaceMgr::send(const Pkt6Ptr& pkt) {
            16);
     to.sin6_scope_id = pkt->getIndex();
 
+    // Initialize our message header structure.
+    struct msghdr m;
+    memset(&m, 0, sizeof(m));
     m.msg_name = &to;
     m.msg_namelen = sizeof(to);
 
@@ -574,6 +571,8 @@ IfaceMgr::send(const Pkt6Ptr& pkt) {
     // (defined as void*) we must use const cast from void *.
     // Otherwise C++ compiler would complain that we are trying
     // to assign const void* to void*.
+    struct iovec v;
+    memset(&v, 0, sizeof(v));
     v.iov_base = const_cast<void *>(pkt->getBuffer().getData());
     v.iov_len = pkt->getBuffer().getLength();
     m.msg_iov = &v;
@@ -587,11 +586,11 @@ IfaceMgr::send(const Pkt6Ptr& pkt) {
     // kernel decide what that should be.
     m.msg_control = &control_buf_[0];
     m.msg_controllen = control_buf_len_;
-    cmsg = CMSG_FIRSTHDR(&m);
+    struct cmsghdr *cmsg = CMSG_FIRSTHDR(&m);
     cmsg->cmsg_level = IPPROTO_IPV6;
     cmsg->cmsg_type = IPV6_PKTINFO;
-    cmsg->cmsg_len = CMSG_LEN(sizeof(*pktinfo));
-    pktinfo = convertPktInfo6(CMSG_DATA(cmsg));
+    cmsg->cmsg_len = CMSG_LEN(sizeof(struct in6_pktinfo));
+    struct in6_pktinfo *pktinfo = convertPktInfo6(CMSG_DATA(cmsg));
     memset(pktinfo, 0, sizeof(*pktinfo));
     pktinfo->ipi6_ifindex = pkt->getIndex();
     m.msg_controllen = cmsg->cmsg_len;
@@ -612,8 +611,6 @@ IfaceMgr::send(const Pkt6Ptr& pkt) {
 bool
 IfaceMgr::send(const Pkt4Ptr& pkt)
 {
-    struct msghdr m;
-    struct iovec v;
 
     Iface* iface = getIface(pkt->getIface());
     if (!iface) {
@@ -623,8 +620,6 @@ IfaceMgr::send(const Pkt4Ptr& pkt)
 
     memset(&control_buf_[0], 0, control_buf_len_);
 
-    // Initialize our message header structure.
-    memset(&m, 0, sizeof(m));
 
     // Set the target address we're sending to.
     sockaddr_in to;
@@ -633,13 +628,20 @@ IfaceMgr::send(const Pkt4Ptr& pkt)
     to.sin_port = htons(pkt->getRemotePort());
     to.sin_addr.s_addr = htonl(pkt->getRemoteAddr());
 
+    struct msghdr m;
+    // Initialize our message header structure.
+    memset(&m, 0, sizeof(m));
     m.msg_name = &to;
     m.msg_namelen = sizeof(to);
 
     // Set the data buffer we're sending. (Using this wacky
     // "scatter-gather" stuff... we only have a single chunk
     // of data to send, so we declare a single vector entry.)
-    v.iov_base = (char *) pkt->getBuffer().getData();
+    struct iovec v;
+    memset(&v, 0, sizeof(v));
+    // iov_base field is of void * type. We use it for packet
+    // transmission, so this buffer will not be modified.
+    v.iov_base = const_cast<void *>(pkt->getBuffer().getData());
     v.iov_len = pkt->getBuffer().getLength();
     m.msg_iov = &v;
     m.msg_iovlen = 1;