]> git.proxmox.com Git - mirror_frr.git/blobdiff - pimd/pim_sock.c
Merge pull request #5581 from Jafaral/pimroute-rf
[mirror_frr.git] / pimd / pim_sock.c
index 2a93b4ad70cf2b608ae641c5441ebe7acca6b4e7..7f03e18389e879db8275efe4862ae63937a133a1 100644 (file)
@@ -46,17 +46,11 @@ int pim_socket_raw(int protocol)
 {
        int fd;
 
-       if (pimd_privs.change(ZPRIVS_RAISE))
-               flog_err(LIB_ERR_PRIVILEGES,
-                         "pim_sockek_raw: could not raise privs, %s",
-                         safe_strerror(errno));
+       frr_with_privs(&pimd_privs) {
 
-       fd = socket(AF_INET, SOCK_RAW, protocol);
+               fd = socket(AF_INET, SOCK_RAW, protocol);
 
-       if (pimd_privs.change(ZPRIVS_LOWER))
-               flog_err(LIB_ERR_PRIVILEGES,
-                         "pim_socket_raw: could not lower privs, %s",
-                         safe_strerror(errno));
+       }
 
        if (fd < 0) {
                zlog_warn("Could not create raw socket: errno=%d: %s", errno,
@@ -71,18 +65,13 @@ void pim_socket_ip_hdr(int fd)
 {
        const int on = 1;
 
-       if (pimd_privs.change(ZPRIVS_RAISE))
-               flog_err(LIB_ERR_PRIVILEGES, "%s: could not raise privs, %s",
-                         __PRETTY_FUNCTION__, safe_strerror(errno));
+       frr_with_privs(&pimd_privs) {
 
-       if (setsockopt(fd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)))
-               flog_err(LIB_ERR_SOCKET,
-                         "%s: Could not turn on IP_HDRINCL option: %s",
-                         __PRETTY_FUNCTION__, safe_strerror(errno));
+               if (setsockopt(fd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)))
+                       zlog_err("%s: Could not turn on IP_HDRINCL option: %s",
+                                __PRETTY_FUNCTION__, safe_strerror(errno));
 
-       if (pimd_privs.change(ZPRIVS_LOWER))
-               flog_err(LIB_ERR_PRIVILEGES, "%s: could not lower privs, %s",
-                         __PRETTY_FUNCTION__, safe_strerror(errno));
+       }
 }
 
 /*
@@ -94,16 +83,12 @@ int pim_socket_bind(int fd, struct interface *ifp)
        int ret = 0;
 #ifdef SO_BINDTODEVICE
 
-       if (pimd_privs.change(ZPRIVS_RAISE))
-               flog_err(LIB_ERR_PRIVILEGES, "%s: could not raise privs, %s",
-                         __PRETTY_FUNCTION__, safe_strerror(errno));
+       frr_with_privs(&pimd_privs) {
 
-       ret = setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, ifp->name,
-                        strlen(ifp->name));
+               ret = setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, ifp->name,
+                                strlen(ifp->name));
 
-       if (pimd_privs.change(ZPRIVS_LOWER))
-               flog_err(LIB_ERR_PRIVILEGES, "%s: could not lower privs, %s",
-                         __PRETTY_FUNCTION__, safe_strerror(errno));
+       }
 
 #endif
        return ret;
@@ -166,7 +151,7 @@ int pim_socket_mcast(int protocol, struct in_addr ifaddr, struct interface *ifp,
                }
 #else
                flog_err(
-                       LIB_ERR_DEVELOPMENT,
+                       EC_LIB_DEVELOPMENT,
                        "%s %s: Missing IP_PKTINFO and IP_RECVDSTADDR: unable to get dst addr from recvmsg()",
                        __FILE__, __PRETTY_FUNCTION__);
                close(fd);
@@ -270,6 +255,12 @@ int pim_socket_mcast(int protocol, struct in_addr ifaddr, struct interface *ifp,
                }
        }
 
+       /* Set Tx socket DSCP byte */
+       if (setsockopt_ipv4_tos(fd, IPTOS_PREC_INTERNETCONTROL)) {
+               zlog_warn("can't set sockopt IP_TOS to PIM/IGMP socket %d: %s",
+                         fd, safe_strerror(errno));
+       }
+
        return fd;
 }
 
@@ -304,7 +295,7 @@ int pim_socket_join(int fd, struct in_addr group, struct in_addr ifaddr,
                        sprintf(ifaddr_str, "<ifaddr?>");
 
                flog_err(
-                       LIB_ERR_SOCKET,
+                       EC_LIB_SOCKET,
                        "Failure socket joining fd=%d group %s on interface address %s: errno=%d: %s",
                        fd, group_str, ifaddr_str, errno, safe_strerror(errno));
                return ret;