Changeset e1e8f7a in mainline
- Timestamp:
 - 2024-12-13T08:44:05Z (11 months ago)
 - Children:
 - e5b2777
 - Parents:
 - 467d2b9
 - git-author:
 - Nataliia Korop <n.corop08@…> (2024-11-16 11:14:06)
 - git-committer:
 - Nataliia Korop <n.corop08@…> (2024-12-13 08:44:05)
 - Location:
 - uspace
 - Files:
 - 
      
- 1 added
 - 8 edited
 
- 
          
  app/pcapctl/main.c (modified) (7 diffs)
 - 
          
  lib/pcap/include/pcap.h (modified) (2 diffs)
 - 
          
  lib/pcap/include/pcap_dumper.h (modified) (1 diff)
 - 
          
  lib/pcap/include/pcapdump_client.h (modified) (1 diff)
 - 
          
  lib/pcap/include/pcapdump_ipc.h (added)
 - 
          
  lib/pcap/include/pcapdump_srv.h (modified) (1 diff)
 - 
          
  lib/pcap/src/pcap_dumper.c (modified) (6 diffs)
 - 
          
  lib/pcap/src/pcapdump_client.c (modified) (6 diffs)
 - 
          
  lib/pcap/src/pcapdump_srv.c (modified) (5 diffs)
 
 
Legend:
- Unmodified
 - Added
 - Removed
 
- 
      
uspace/app/pcapctl/main.c
r467d2b9 re1e8f7a 43 43 #define NAME "pcapctl" 44 44 #define DEFAULT_DEV_NUM 0 45 #define DECIMAL_SYSTEM 10 45 46 46 static errno_t start_dumping(int *dev_number, const char *name )47 static errno_t start_dumping(int *dev_number, const char *name, int *ops_index) 47 48 { 48 49 pcapctl_sess_t *sess = NULL; … … 52 53 } 53 54 54 rc = pcapctl_dump_start(name, sess); 55 rc = pcapctl_is_valid_ops_number(ops_index, sess); 56 if (rc != EOK) 57 { 58 printf("Wrong number of ops: %d.\n", *ops_index); 59 pcapctl_dump_close(sess); 60 return rc; 61 } 62 63 rc = pcapctl_dump_start(name, ops_index, sess); 55 64 if (rc != EOK) { 56 65 printf("Starting the dumping was not successful.\n"); … … 70 79 if (rc != EOK) { 71 80 printf("Stoping the dumping was not successful.\n"); 72 }73 pcapctl_dump_close(sess);74 return EOK;75 }76 77 static errno_t set_dumper_ops(int *dev_number, const char *name)78 {79 pcapctl_sess_t *sess = NULL;80 errno_t rc = pcapctl_dump_open(dev_number, &sess);81 if (rc != EOK) {82 return rc;83 }84 85 rc = pcapctl_dump_set_ops(name, sess);86 if (rc != EOK) {87 printf("Setting dumper ops was not successful.\n");88 81 } 89 82 pcapctl_dump_close(sess); … … 129 122 bool start = false; 130 123 bool stop = false; 131 bool set_ops = false;132 124 int dev_number = -1; 125 int ops_number = -1; 133 126 const char *output_file_name = ""; 134 const char *ops_name = "";135 127 int idx = 0; 136 128 int ret = 0; … … 144 136 case 'd': 145 137 char *rest; 146 long result = strtol(optarg, &rest, 10);147 dev_number = (int) result;138 long dev_result = strtol(optarg, &rest, DECIMAL_SYSTEM); 139 dev_number = (int)dev_result; 148 140 errno_t rc = pcapctl_is_valid_device(&dev_number); 149 141 if (rc != EOK) { … … 168 160 break; 169 161 case 'o': 170 set_ops = true; 171 ops_name = optarg; 162 char* ops_inval; 163 long ops_result = strtol(optarg, &ops_inval, DECIMAL_SYSTEM); 164 ops_number = (int)ops_result; 172 165 break; 173 166 } … … 178 171 if (start) { 179 172 /* start with dev number and name */ 180 start_dumping(&dev_number, output_file_name );173 start_dumping(&dev_number, output_file_name, &ops_number); 181 174 } else if (stop) { 182 175 /* stop with dev number */ 183 176 stop_dumping(&dev_number); 184 } else if (set_ops) {185 set_dumper_ops(&dev_number, ops_name);186 177 } 187 178 return 0;  - 
      
uspace/lib/pcap/include/pcap.h
r467d2b9 re1e8f7a 81 81 /** Operations for dumper. */ 82 82 typedef struct { 83 errno_t (*open)( struct pcap_writer*, const char *);83 errno_t (*open)(pcap_writer_t *, const char *); 84 84 size_t (*write_u32)(struct pcap_writer *, uint32_t); 85 85 size_t (*write_u16)(struct pcap_writer *, uint16_t); … … 89 89 90 90 /** Interface for working with .pcap file. */ 91 typedefstruct pcap_writer {91 struct pcap_writer { 92 92 void *data; 93 93 pcap_writer_ops_t *ops; 94 } pcap_writer_t;94 }; 95 95 96 96 extern void pcap_writer_add_header(pcap_writer_t *writer);  - 
      
uspace/lib/pcap/include/pcap_dumper.h
r467d2b9 re1e8f7a 47 47 48 48 extern void pcap_dumper_stop(struct pcap_dumper *); 49 extern errno_t pcap_dumper_init(pcap_dumper_t *); 50 extern errno_t pcap_dumper_set_ops(struct pcap_dumper *, const char *); 49 extern errno_t pcap_dumper_init(pcap_dumper_t *); ///tahle 50 extern int pcap_dumper_get_ops_number(void); 51 extern errno_t pcap_dumper_set_ops(struct pcap_dumper *, int); 51 52 extern errno_t pcap_dumper_start(struct pcap_dumper *, const char *); 52 53 extern void pcap_dumper_add_packet(struct pcap_dumper *, const void *data, size_t size);  - 
      
uspace/lib/pcap/include/pcapdump_client.h
r467d2b9 re1e8f7a 51 51 extern errno_t pcapctl_dump_open(int *, pcapctl_sess_t **); 52 52 extern errno_t pcapctl_dump_close(pcapctl_sess_t *); 53 extern errno_t pcapctl_dump_start(const char *, pcapctl_sess_t *);54 extern errno_t pcapctl_dump_set_ops(const char *, pcapctl_sess_t *);53 extern errno_t pcapctl_dump_start(const char *, int *, pcapctl_sess_t *); 54 // extern errno_t pcapctl_dump_set_ops(const char *, pcapctl_sess_t *); 55 55 extern errno_t pcapctl_dump_stop(pcapctl_sess_t *); 56 56 extern errno_t pcapctl_list(void); 57 57 extern errno_t pcapctl_is_valid_device(int *); 58 extern errno_t pcapctl_is_valid_ops_number(int *index, pcapctl_sess_t* sess); 59 58 60 59 61 #endif  - 
      
uspace/lib/pcap/include/pcapdump_srv.h
r467d2b9 re1e8f7a 42 42 #include "pcap_dumper.h" 43 43 44 typedef enum {45 PCAP_CONTROL_SET_START = IPC_FIRST_USER_METHOD,46 PCAP_CONTROL_SET_STOP,47 PCAP_CONTROL_GET_NAME,48 PCAP_CONTROL_SET_OPS,49 } pcap_request_t;50 51 44 extern errno_t pcapdump_init(pcap_dumper_t *); 52 45 extern void pcapdump_packet(pcap_dumper_t *, const void *, size_t);  - 
      
uspace/lib/pcap/src/pcap_dumper.c
r467d2b9 re1e8f7a 39 39 #include "pcap_dumper.h" 40 40 41 #define SHORT_OPS_BYTE_COUNT 60 42 #define NAME "pcap" 43 41 44 /** Initialize writing to .pcap file. 42 45 * … … 48 51 static errno_t pcap_writer_to_file_init(pcap_writer_t *writer, const char *filename) 49 52 { 50 errno_t rc;51 53 writer->data = fopen(filename, "a"); 52 54 if (writer->data == NULL) { 53 rc = EINVAL; 54 return rc; 55 return EINVAL; 55 56 } 56 57 pcap_writer_add_header(writer); 57 58 58 rc = EOK; 59 return rc; 59 return EOK; 60 } 61 62 static errno_t pcap_writer_to_file_init_append(pcap_writer_t *writer, const char *filename) 63 { 64 writer->data = fopen(filename, "a"); 65 if (writer->data == NULL) { 66 return EINVAL; 67 } 68 69 return EOK; 60 70 } 61 71 … … 82 92 } 83 93 84 static pcap_writer_ops_t file_ops = {94 static const pcap_writer_ops_t file_ops = { 85 95 .open = &pcap_writer_to_file_init, 86 96 .write_u32 = &pcap_file_w32, … … 90 100 }; 91 101 92 static size_t pcap_short_file_w32(pcap_writer_t *writer, uint32_t data)93 {94 return fwrite(&data, 1, 4, (FILE *)writer->data);95 }96 97 static size_t pcap_short_file_w16(pcap_writer_t *writer, uint16_t data)98 {99 return fwrite(&data, 1, 2, (FILE *)writer->data);100 }101 102 102 static size_t pcap_short_file_wbuffer(pcap_writer_t *writer, const void *data, size_t size) 103 103 { 104 return fwrite(data, 1, size < 60 ? size : 60, (FILE *)writer->data); 105 } 106 107 static void pcap_short_file_close(pcap_writer_t *writer) 108 { 109 fclose((FILE *)writer->data); 110 } 111 112 static pcap_writer_ops_t short_file_ops = { 104 return fwrite(data, 1, size < 60 ? size : 60, (FILE *)writer->data); //define 105 } 106 107 static const pcap_writer_ops_t short_file_ops = { 113 108 .open = &pcap_writer_to_file_init, 114 .write_u32 = &pcap_ short_file_w32,115 .write_u16 = &pcap_ short_file_w16,109 .write_u32 = &pcap_file_w32, 110 .write_u16 = &pcap_file_w16, 116 111 .write_buffer = &pcap_short_file_wbuffer, 117 .close = &pcap_ short_file_close112 .close = &pcap_file_close 118 113 119 114 }; 115 116 static const pcap_writer_ops_t append_file_ops = { 117 .open = &pcap_writer_to_file_init_append, 118 .write_u32 = &pcap_file_w32, 119 .write_u16 = &pcap_file_w16, 120 .write_buffer = &pcap_file_wbuffer, 121 .close = &pcap_file_close 122 }; 123 124 static pcap_writer_ops_t ops[3] = {file_ops, short_file_ops, append_file_ops}; 125 126 int pcap_dumper_get_ops_number(void) 127 { 128 return (int)(sizeof(ops) / sizeof(pcap_writer_ops_t)); 129 } 120 130 121 131 errno_t pcap_dumper_start(struct pcap_dumper *dumper, const char *name) … … 137 147 } 138 148 139 errno_t pcap_dumper_set_ops(struct pcap_dumper *dumper, const char *name)149 errno_t pcap_dumper_set_ops(struct pcap_dumper *dumper, int index) 140 150 { 141 151 fibril_mutex_lock(&dumper->mutex); 142 152 errno_t rc = EOK; 143 if (!str_cmp(name, "short_file")) { 144 dumper->writer.ops = &short_file_ops; 145 } else if (!str_cmp(name, "full_file")) { 146 dumper->writer.ops = &file_ops; 147 } else { 148 rc = EINVAL; 149 } 153 dumper->writer.ops = &ops[index]; 150 154 fibril_mutex_unlock(&dumper->mutex); 151 155 return rc; … … 190 194 dumper->writer.ops = NULL; 191 195 192 errno_t rc = log_init( "pcap");196 errno_t rc = log_init(NAME); 193 197 if (rc != EOK) { 194 printf(" pcap : Failed to initialize log.\n");198 printf("%s : Failed to initialize log.\n", NAME); 195 199 return 1; 196 200 }  - 
      
uspace/lib/pcap/src/pcapdump_client.c
r467d2b9 re1e8f7a 41 41 #include <ctype.h> 42 42 #include "pcapdump_client.h" 43 #include "pcapdump_ srv.h"43 #include "pcapdump_ipc.h" 44 44 45 45 /** Finish an async exchange on the pcapctl session … … 100 100 } 101 101 if (*index + 1 > (int)count || *index < 0) { 102 return EINVAL; 103 } 104 return EOK; 105 } 106 107 108 errno_t pcapctl_is_valid_ops_number(int *index, pcapctl_sess_t* sess) 109 { 110 async_exch_t *exch = async_exchange_begin(sess->sess); 111 ipc_call_t answer; 112 aid_t req = async_send_0(exch, PCAP_CONTROL_GET_OPS_NUM, &answer); 113 114 async_exchange_end(exch); 115 116 errno_t retval; 117 async_wait_for(req, &retval); 118 119 if (retval != EOK) { 120 return retval; 121 } 122 123 int ops_count = (int)ipc_get_arg1(&answer); 124 if (*index + 1 > ops_count || *index < 0) 125 { 102 126 return EINVAL; 103 127 } … … 149 173 return ENOMEM; 150 174 151 printf("number: %d\n", *index);152 175 if (*index == -1) { 153 176 *index = 0; … … 190 213 * @return EOK on success or an error code 191 214 */ 192 errno_t pcapctl_dump_start(const char *name, pcapctl_sess_t *sess)215 errno_t pcapctl_dump_start(const char *name, int *ops_index, pcapctl_sess_t *sess) 193 216 { 194 217 errno_t rc; … … 196 219 197 220 size_t size = str_size(name); 198 aid_t req = async_send_ 0(exch, PCAP_CONTROL_SET_START, NULL);221 aid_t req = async_send_1(exch, PCAP_CONTROL_SET_START, *ops_index, NULL); 199 222 200 223 rc = async_data_write_start(exch, name, size); … … 227 250 } 228 251 229 errno_t pcapctl_dump_set_ops(const char *ops_name, pcapctl_sess_t *sess)230 {231 errno_t rc;232 async_exch_t *exch = async_exchange_begin(sess->sess);233 234 size_t size = str_size(ops_name);235 aid_t req = async_send_0(exch, PCAP_CONTROL_SET_OPS, NULL);236 237 rc = async_data_write_start(exch, ops_name, size);238 239 pcapctl_dump_exchange_end(exch);240 241 if (rc != EOK) {242 async_forget(req);243 return rc;244 }245 246 errno_t retval;247 async_wait_for(req, &retval);248 return retval;249 }250 252 251 253 /** @}  - 
      
uspace/lib/pcap/src/pcapdump_srv.c
r467d2b9 re1e8f7a 44 44 45 45 #include "pcapdump_srv.h" 46 #include "pcapdump_ipc.h" 46 47 47 48 static void pcapdump_start_srv(ipc_call_t *icall, pcap_dumper_t *dumper) … … 49 50 char *data; 50 51 size_t size; 52 int ops_index = (int)ipc_get_arg1(icall); 51 53 errno_t rc = async_data_write_accept((void **) &data, true, 0, 0, 0, &size); 52 54 if (rc != EOK) { … … 56 58 57 59 assert(str_length(data) == size && "Data were damaged during transmission.\n"); 60 61 rc = pcap_dumper_set_ops(dumper, ops_index); 62 if (rc != EOK) 63 { 64 log_msg(LOG_DEFAULT, LVL_DEBUG, "Setting ops for dumper was not successful.\n"); 65 free(data); 66 async_answer_0(icall, EOK); 67 return; 68 } 58 69 59 70 rc = pcap_dumper_start(dumper, (const char *)data); … … 71 82 } 72 83 73 static void pcapdump_set_ops_srv(ipc_call_t *icall, pcap_dumper_t *dumper) 84 85 static void pcapdump_get_ops_num_srv(ipc_call_t *icall) 74 86 { 75 char *data; 76 size_t size; 77 errno_t rc = async_data_write_accept((void **) &data, true, 0, 0, 0, &size); 78 if (rc != EOK) { 79 async_answer_0(icall, rc); 80 return; 81 } 87 size_t count = pcap_dumper_get_ops_number(); 82 88 83 assert(str_length(data) == size && "Data were damaged during transmission.\n");89 log_msg(LOG_DEFAULT, LVL_NOTE, "Getting number of ops.\n"); 84 90 85 rc = pcap_dumper_set_ops(dumper, (const char *)data); 86 free(data); 87 if (rc != EOK) { 88 log_msg(LOG_DEFAULT, LVL_DEBUG, "Setting ops for dumper was not successful.\n"); 89 } 90 91 log_msg(LOG_DEFAULT, LVL_NOTE, "Setting ops for dumper was successful.\n"); 92 93 async_answer_0(icall, EOK); 91 async_answer_1(icall, EOK, count); 94 92 } 95 93 … … 119 117 pcapdump_stop_srv(&call, dumper); 120 118 break; 121 case PCAP_CONTROL_ SET_OPS:122 pcapdump_ set_ops_srv(&call, dumper);119 case PCAP_CONTROL_GET_OPS_NUM: 120 pcapdump_get_ops_num_srv(&call); 123 121 break; 124 122 default:  
  Note:
 See   TracChangeset
 for help on using the changeset viewer.
  