Line data Source code
1 : /*
2 : * vr_dpdk_filestore.c - implements a persistent store
3 : * to store/retrieve the VM feature set.
4 : *
5 : * Copyright (c) 2018 Juniper Networks, Inc. All rights reserved.
6 : */
7 :
8 : #include <fcntl.h>
9 : #include <sys/types.h>
10 : #include <sys/stat.h>
11 : #include <unistd.h>
12 : #include <errno.h>
13 :
14 : #include "vr_dpdk.h"
15 : #define FEATURE_STORE_PATH "/var/lib/contrail/vm_feature"
16 :
17 0 : int vr_dpdk_store_persist_feature(char *tapdev_name, unsigned long feature_set)
18 : {
19 : char fname[NAME_MAX];
20 : struct stat fstat;
21 : FILE *fp;
22 :
23 0 : if (stat(FEATURE_STORE_PATH, &fstat) != 0) {
24 0 : if (mkdir(FEATURE_STORE_PATH, 0755) < 0) {
25 0 : RTE_LOG(ERR, USOCK, "mkdir failed with error %d\n", errno);
26 0 : return -1;
27 : }
28 : }
29 :
30 0 : if (snprintf(fname, NAME_MAX, FEATURE_STORE_PATH"/%s", tapdev_name) < 0)
31 0 : return -1;
32 :
33 : RTE_LOG_DP(DEBUG, USOCK, "Write persistent feature %s\n", fname);
34 :
35 0 : fp = fopen(fname, "w");
36 0 : if (fp == NULL) {
37 0 : return -1;
38 : }
39 0 : rewind(fp);
40 0 : fprintf(fp, "%016lx", feature_set);
41 0 : fclose(fp);
42 0 : return 0;
43 : }
44 :
45 0 : int vr_dpdk_load_persist_feature(char *tapdev_name, unsigned long *feature_set)
46 : {
47 : char fname[NAME_MAX];
48 : struct stat fstat;
49 : FILE *fp;
50 :
51 0 : if (stat(FEATURE_STORE_PATH, &fstat) != 0) {
52 0 : if (mkdir(FEATURE_STORE_PATH, 0755) < 0) {
53 0 : RTE_LOG(ERR, USOCK, "mkdir failed with error %d\n", errno);
54 0 : return -1;
55 : }
56 : }
57 :
58 0 : if (snprintf(fname, NAME_MAX, FEATURE_STORE_PATH"/%s", tapdev_name) < 0)
59 0 : return -1;
60 :
61 : RTE_LOG_DP(DEBUG, USOCK, "Read persistent feature %s\n", fname);
62 :
63 0 : if (stat(fname, &fstat) == 0) {
64 0 : fp = fopen(fname, "r");
65 0 : if (fp == NULL) {
66 0 : return -1;
67 : }
68 0 : rewind(fp);
69 0 : if(fscanf(fp, "%016lx", feature_set) == EOF) {
70 0 : if (errno) {
71 0 : RTE_LOG(ERR, USOCK, "EOF reached with error %d for tapdev %s\n",
72 : errno, tapdev_name);
73 0 : fclose(fp);
74 0 : return -1;
75 : }
76 : }
77 : RTE_LOG_DP(DEBUG, USOCK, "Feature Set Read %lx for tapdev %s\n",
78 : *feature_set, tapdev_name);
79 0 : fclose(fp);
80 0 : return 0;
81 : } else {
82 0 : return -1;
83 : }
84 : }
85 :
86 0 : void vr_dpdk_del_persist_feature(char *tapdev_name)
87 : {
88 : char fname[NAME_MAX];
89 : struct stat fstat;
90 :
91 0 : if (snprintf(fname, NAME_MAX, FEATURE_STORE_PATH"/%s", tapdev_name) < 0)
92 0 : return;
93 :
94 0 : if (stat(fname, &fstat) == 0) {
95 0 : if(unlink(fname)) {
96 0 : RTE_LOG(ERR, USOCK, "Error deleting file %d for tapdev %s\n",
97 : errno, tapdev_name);
98 : }
99 : }
100 : }
|