On Tue, Aug 06, 2019 at 02:54:06PM +0800, Isaac Khor wrote:
> From: "Khor, Isaac Shi Yan" <isaac.shi.yan.k...@intel.com>
> 
> Users may need to use different socket priorities for ptp4l traffic for
> the purpose of traffic shaping. An example is to route ptp4l traffic
> through a specific Linux egress qdisc.
> 
>  - Update raw.c open_socket() to accept a socket_priority parameter
>  - Update ptp4l.c to accept a '-c' command line argument to configure
>    its egress socket priority
>  - Add the socket_priority option to config.c and the default.cfg config
>    file. The option defaults to 0.
> 
> CC: "Wong, Vincent Por Yin" <vincent.por.yin.w...@intel.com>
> CC: "Ong, Boon Leong" <boon.leong....@intel.com>
> Signed-off-by: Khor, Isaac Shi Yan <isaac.shi.yan.k...@intel.com>
> ---
> 
> This patch adds an option to configure the socket priority of sockets
> used by ptp4l. This is to support cases where a user may want to route
> ptp4l traffic to specific egress qdiscs. For example, in a network-heavy
> workload, a user may want to route ptp4l traffic to a specific egress
> queue that has priority over other outbound traffic.
> 
> The configuration is introduced as the 'socket_priority' option in the
> configuration file and the '-c' command line argument, and must be
> between 0 and 15, inclusive.
> 
> Only the IEEE 802.3 raw transport type is modified to support this
> option. The UDS and IPv4/6 types have not been modified.

Please also update the man page to explain the new option.  You can
use much of the above text.
 
> Feedback on both the placement of the configuration option, the
> setsockopt() syscall, and other areas are welcome and appreciated.
> 
>  config.c            |  1 +
>  configs/default.cfg |  1 +
>  ptp4l.c             | 10 ++++++++--
>  raw.c               | 17 ++++++++++++++---
>  4 files changed, 24 insertions(+), 5 deletions(-)
> 
> diff --git a/config.c b/config.c
> index 93ea5da..3346081 100644
> --- a/config.c
> +++ b/config.c
> @@ -305,6 +305,7 @@ struct config_item config_tab[] = {
>       GLOB_ITEM_STR("userDescription", ""),
>       GLOB_ITEM_INT("utc_offset", CURRENT_UTC_OFFSET, 0, INT_MAX),
>       GLOB_ITEM_INT("verbose", 0, 0, 1),
> +     GLOB_ITEM_INT("socket_priority", 0, 0, 15),

Maintain the alphabetical ordering please.

>  };
>  
>  static struct unicast_master_table *current_uc_mtab;
> diff --git a/configs/default.cfg b/configs/default.cfg
> index e23dfd7..c52dc37 100644
> --- a/configs/default.cfg
> +++ b/configs/default.cfg
> @@ -4,6 +4,7 @@
>  #
>  twoStepFlag          1
>  slaveOnly            0
> +socket_priority              0
>  priority1            128
>  priority2            128
>  domainNumber         0
> diff --git a/ptp4l.c b/ptp4l.c
> index 84661c5..ffdf989 100644
> --- a/ptp4l.c
> +++ b/ptp4l.c
> @@ -59,6 +59,7 @@ static void usage(char *progname)
>               " -p [dev]  Clock device to use, default auto\n"
>               "           (ignored for SOFTWARE/LEGACY HW time stamping)\n"
>               " -s        slave only mode (overrides configuration file)\n"
> +             " -c [num]  set socket priority (must be between 0 and 15)\n"

No need for this new the flag.  The --socket_priority command line
option will be added automatically.

>               " -l [num]  set the logging level to 'num'\n"
>               " -m        print messages to stdout\n"
>               " -q        do not print messages to the syslog\n"
> @@ -70,9 +71,9 @@ static void usage(char *progname)
>  
>  int main(int argc, char *argv[])
>  {
> +     int c, err = -1, index, print_level, socket_priority = 0;
>       char *config = NULL, *req_phc = NULL, *progname;
>       enum clock_type type = CLOCK_TYPE_ORDINARY;
> -     int c, err = -1, index, print_level;
>       struct clock *clock = NULL;
>       struct option *opts;
>       struct config *cfg;
> @@ -89,7 +90,7 @@ int main(int argc, char *argv[])
>       /* Process the command line arguments. */
>       progname = strrchr(argv[0], '/');
>       progname = progname ? 1+progname : argv[0];
> -     while (EOF != (c = getopt_long(argc, argv, "AEP246HSLf:i:p:sl:mqvh",
> +     while (EOF != (c = getopt_long(argc, argv, "AEP246HSLf:i:p:sc:l:mqvh",
>                                      opts, &index))) {
>               switch (c) {
>               case 0:
> @@ -150,6 +151,11 @@ int main(int argc, char *argv[])
>                               goto out;
>                       }
>                       break;
> +             case 'c':
> +                     if (get_arg_val_i(c, optarg, &socket_priority, 0, 15))
> +                             goto out;
> +                     config_set_int(cfg, "socket_priority", socket_priority);
> +                     break;
>               case 'l':
>                       if (get_arg_val_i(c, optarg, &print_level,
>                                         PRINT_LEVEL_MIN, PRINT_LEVEL_MAX))
> diff --git a/raw.c b/raw.c
> index 8dc50bc..eebd10f 100644
> --- a/raw.c
> +++ b/raw.c
> @@ -150,7 +150,7 @@ static int raw_close(struct transport *t, struct fdarray 
> *fda)
>  }
>  
>  static int open_socket(const char *name, int event, unsigned char 
> *ptp_dst_mac,
> -                    unsigned char *p2p_dst_mac)
> +                    unsigned char *p2p_dst_mac, int socket_priority)
>  {
>       struct sockaddr_ll addr;
>       int fd, index;
> @@ -176,6 +176,13 @@ static int open_socket(const char *name, int event, 
> unsigned char *ptp_dst_mac,
>               pr_err("setsockopt SO_BINDTODEVICE failed: %m");
>               goto no_option;
>       }
> +
> +     if (socket_priority > 0 &&
> +         setsockopt(fd, SOL_SOCKET, SO_PRIORITY, &socket_priority,
> +                    sizeof(socket_priority))) {
> +             pr_err("setsockopt SO_PRIORITY failed: %m");
> +             goto no_option;
> +     }
>       if (raw_configure(fd, event, index, ptp_dst_mac, p2p_dst_mac, 1))
>               goto no_option;
>  
> @@ -207,6 +214,7 @@ static int raw_open(struct transport *t, struct interface 
> *iface,
>       unsigned char p2p_dst_mac[MAC_LEN];
>       int efd, gfd;
>       char *str, *name;
> +     int socket_priority;

Put this in the list of 'int' with efd and gfd.

>  
>       name = iface->ts_label;
>       str = config_get_string(t->cfg, name, "ptp_dst_mac");

Thanks,
Richard


_______________________________________________
Linuxptp-devel mailing list
Linuxptp-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxptp-devel

Reply via email to