Changeset 03cd7a9e in mainline
- Timestamp:
- 2024-12-13T08:44:05Z (10 months ago)
- Children:
- f08447b
- Parents:
- 59fe16d
- git-author:
- Nataliia Korop <n.corop08@…> (2024-10-28 09:57:08)
- git-committer:
- Nataliia Korop <n.corop08@…> (2024-12-13 08:44:05)
- Location:
- uspace
- Files:
-
- 14 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/pcapctl/main.c
r59fe16d r03cd7a9e 107 107 bool stop = false; 108 108 int dev_number = -1; 109 const char *output_file_name ;109 const char *output_file_name = ""; 110 110 int idx = 0; 111 111 int ret = 0; … … 117 117 ret = getopt_long(argc, argv, "d:lhf:rt", opts, &idx); 118 118 switch (ret) { 119 case 'd': 120 char *rest; 121 long result = strtol(optarg, &rest, 10); 122 dev_number = (int)result; 123 errno_t rc = pcapctl_is_valid_device(&dev_number); 124 if (rc != EOK) { 125 printf("Device with index %d not found\n", dev_number); 126 return 1; 119 case 'd': 120 { 121 char *rest; 122 long result = strtol(optarg, &rest, 10); 123 dev_number = (int)result; 124 errno_t rc = pcapctl_is_valid_device(&dev_number); 125 if (rc != EOK) { 126 printf("Device with index %d not found\n", dev_number); 127 return 1; 128 } 129 break; 127 130 } 128 break; 129 case 'l': 130 list_devs(); 131 return 0; 132 case 'h': 133 usage(); 134 return 0; 135 case 'f': 136 output_file_name = optarg; 137 break; 138 case 'r': 139 start = true; 140 break; 141 case 't': 142 stop = true; 143 break; 131 case 'l': 132 { 133 list_devs(); 134 return 0; 135 } 136 case 'h': 137 { 138 usage(); 139 return 0; 140 } 141 case 'f': 142 { 143 output_file_name = optarg; 144 break; 145 } 146 case 'r': 147 { 148 start = true; 149 break; 150 } 151 case 't': 152 { stop = true; 153 break; 154 } 144 155 } 145 156 } 146 157 147 printf("%s: HelenOS Packet Dumping utility: device - %d \n", NAME, dev_number);158 printf("%s: HelenOS Packet Dumping utility: device - %d.\n", NAME, dev_number); 148 159 149 160 if (start) { 150 / / start with dev number and optional..name161 /* start with dev number and name*/ 151 162 start_dumping(&dev_number, output_file_name); 152 163 } else if (stop) { 153 / /stop with dev number164 /* stop with dev number*/ 154 165 stop_dumping(&dev_number); 155 166 } -
uspace/drv/nic/e1k/e1k.c
r59fe16d r03cd7a9e 2209 2209 return EOK; 2210 2210 2211 // err_add_to_cat:2212 // ddf_fun_unbind(fun);2213 2211 err_fun_bind: 2214 2212 err_rx_structure: -
uspace/lib/nic/include/nic.h
r59fe16d r03cd7a9e 280 280 281 281 /* pcapdump interface */ 282 extern pcap_ iface_t *nic_get_pcap_iface(nic_t *);282 extern pcap_dumper_t *nic_get_pcap_iface(nic_t *); 283 283 284 284 extern errno_t nic_fun_add_to_cats(ddf_fun_t *fun); -
uspace/lib/nic/include/nic_driver.h
r59fe16d r03cd7a9e 198 198 199 199 /** Interface for dumping packets */ 200 pcap_ iface_t pcapdump;200 pcap_dumper_t pcapdump; 201 201 202 202 /** Data specific for particular driver */ -
uspace/lib/nic/src/nic_driver.c
r59fe16d r03cd7a9e 1141 1141 } 1142 1142 1143 pcap_ iface_t *nic_get_pcap_iface(nic_t *nic_data)1143 pcap_dumper_t *nic_get_pcap_iface(nic_t *nic_data) 1144 1144 { 1145 1145 return &nic_data->pcapdump; -
uspace/lib/nic/src/nic_impl.c
r59fe16d r03cd7a9e 850 850 if (rc != EOK) 851 851 return rc; 852 return rc;853 852 854 853 rc = ddf_fun_add_to_category(fun, "pcap"); -
uspace/lib/pcap/include/pcap.h
r59fe16d r03cd7a9e 54 54 #define PCAP_LINKTYPE_ETHERNET 1 /* IEEE 802.3 Ethernet */ 55 55 #define PCAP_LINKTYPE_IP_RAW 101 /* Raw IP packet */ 56 #define PCAP_LINKTYPE_IEEE802_11_RADIO 127 56 57 #define WIRESHARK_EX 0xc 57 58 #define WIRESHARK_SNAPLEN 0xffff … … 99 100 pcap_writer_t *writer, const void *captured_packet, size_t size); 100 101 101 extern void pcap_set_time(pcap_packet_header_t *header , bool nano);102 extern void pcap_set_time(pcap_packet_header_t *header); 102 103 103 104 #endif -
uspace/lib/pcap/include/pcap_iface.h
r59fe16d r03cd7a9e 37 37 38 38 #include <errno.h> 39 #include <fibril_synch.h> 39 40 #include "pcap.h" 40 41 41 typedef struct pcap_iface { 42 typedef struct pcap_dumper { 43 fibril_mutex_t mutex; 42 44 bool to_dump; 43 errno_t (*init)(const char *); 44 void (*add_packet)(const void *data, size_t size); 45 void (*fini)(void); 46 } pcap_iface_t; 45 pcap_writer_t writer; 46 } pcap_dumper_t; 47 47 48 extern void pcap_close_file(void); 49 extern errno_t pcap_iface_init(pcap_iface_t*);50 //init to file 51 //init to serial 52 //add packet, dostane strukturu, data, velikost ... to to this pcap_iface_t 48 49 extern void pcap_dumper_stop(struct pcap_dumper *); 50 51 extern errno_t pcap_dumper_init(pcap_dumper_t *); 52 53 53 // v ramci init jeste linktype prg 54 54 //set snaplen taky lze pridavat prg 55 //create kam posila 56 // init 57 extern errno_t pcap_init(const char *); 58 extern void pcap_add_packet(const void *data, size_t size); 55 56 extern errno_t pcap_dumper_start(struct pcap_dumper *, const char *); 57 extern void pcap_dumper_add_packet(struct pcap_dumper *, const void *data, size_t size); 59 58 60 59 #endif -
uspace/lib/pcap/include/pcapdump_iface.h
r59fe16d r03cd7a9e 48 48 } pcap_request_t; 49 49 50 extern errno_t pcapdump_init(pcap_iface_t *); 51 extern void pcapdump_packet(pcap_iface_t *, const void *, size_t); 52 50 extern errno_t pcapdump_init(pcap_dumper_t *); 51 extern void pcapdump_packet(pcap_dumper_t *, const void *, size_t); 53 52 extern void pcapdump_conn(ipc_call_t *, void *); 54 53 #endif -
uspace/lib/pcap/src/pcap.c
r59fe16d r03cd7a9e 43 43 * 44 44 */ 45 void pcap_set_time(pcap_packet_header_t *header , bool nano) // maybe without bool nano as nano is in pcapng45 void pcap_set_time(pcap_packet_header_t *header) 46 46 { 47 47 struct timespec ts; 48 48 getrealtime(&ts); 49 49 header->seconds_stamp = (uint32_t)ts.tv_sec; 50 header->magic_stamp = (uint32_t)ts.tv_nsec / 1000;50 header->magic_stamp = (uint32_t)ts.tv_nsec; 51 51 } 52 52 … … 58 58 void pcap_writer_add_header(pcap_writer_t *writer) 59 59 { 60 pcap_file_header_t file_header = { PCAP_MAGIC_ MICRO, PCAP_MAJOR_VERSION, PCAP_MINOR_VERSION,60 pcap_file_header_t file_header = { PCAP_MAGIC_NANO, PCAP_MAJOR_VERSION, PCAP_MINOR_VERSION, 61 61 0x00000000, 0x00000000, (uint32_t)PCAP_SNAP_LEN, (uint32_t)PCAP_LINKTYPE_ETHERNET }; 62 62 writer->ops->write_buffer(writer, &file_header, sizeof(file_header)); … … 75 75 return; 76 76 pcap_packet_header_t pcap_packet; 77 pcap_set_time(&pcap_packet , false);78 pcap_packet.original_length = (uint32_t)size;77 pcap_set_time(&pcap_packet); 78 pcap_packet.original_length = size; 79 79 80 80 if (PCAP_SNAP_LEN < size) { … … 98 98 { 99 99 errno_t rc; 100 printf("File: %s\n", filename);101 100 writer->data = fopen(filename, "a"); 102 101 if (writer->data == NULL) { -
uspace/lib/pcap/src/pcap_iface.c
r59fe16d r03cd7a9e 65 65 }; 66 66 67 static pcap_writer_t pcap_writer = { 68 .ops = &file_ops, 69 }; 67 // static size_t pcap_short_file_w32(pcap_writer_t *writer, uint32_t data) 68 // { 69 // return fwrite(&data, 1, 4, (FILE *)writer->data); 70 // } 70 71 71 errno_t pcap_init(const char *name) 72 // static size_t pcap_short_file_w16(pcap_writer_t *writer, uint16_t data) 73 // { 74 // return fwrite(&data, 1, 2, (FILE *)writer->data); 75 // } 76 77 // static size_t pcap_short_file_wbuffer(pcap_writer_t *writer, const void *data, size_t size) 78 // { 79 // return fwrite(data, 1, size<60?size:60, (FILE *)writer->data); 80 // } 81 82 // static void pcap_short_file_close(pcap_writer_t *writer) 83 // { 84 // fclose((FILE *)writer->data); 85 // } 86 87 88 // static pcap_writer_ops_t short_file_ops = { 89 // .write_u32 = &pcap_short_file_w32, 90 // .write_u16 = &pcap_short_file_w16, 91 // .write_buffer = &pcap_short_file_wbuffer, 92 // .close = &pcap_short_file_close 93 94 // }; 95 96 errno_t pcap_dumper_start(struct pcap_dumper *dumper, const char *name) 72 97 { 73 errno_t rc = pcap_writer_to_file_init(&pcap_writer, name); 98 fibril_mutex_lock(&dumper->mutex); 99 100 /** When try to start when already started, close current and starts new */ 101 if (dumper->to_dump == true) 102 { 103 pcap_dumper_stop(dumper); 104 } 105 errno_t rc = pcap_writer_to_file_init(&dumper->writer, name); 106 if (rc == EOK) 107 { 108 dumper->to_dump = true; 109 } 110 else 111 { 112 printf("Failed creating pcap dumper: %s", str_error(rc)); 113 } 114 fibril_mutex_unlock(&dumper->mutex); 74 115 return rc; 75 116 } 76 117 77 void pcap_add_packet(const void *data, size_t size) 118 //udelat globalni 119 void pcap_dumper_add_packet(struct pcap_dumper *dumper, const void *data, size_t size) 78 120 { 79 if (pcap_writer.data == NULL) 121 fibril_mutex_lock(&dumper->mutex); 122 123 if (dumper->writer.data == NULL || !dumper->to_dump) 124 { 125 fibril_mutex_unlock(&dumper->mutex); 80 126 return; 81 pcap_writer_add_packet(&pcap_writer, data, size); 127 } 128 pcap_writer_add_packet(&dumper->writer, data, size); 129 fibril_mutex_unlock(&dumper->mutex); 82 130 } 83 131 84 void pcap_close_file(void) 132 //udelt globalni 133 void pcap_dumper_stop(struct pcap_dumper *dumper) 85 134 { 86 pcap_writer.ops->close(&pcap_writer); 87 pcap_writer.data = NULL; 135 fibril_mutex_lock(&dumper->mutex); 136 137 /** If want to stop, when already stopped, do nothing */ 138 if (dumper->to_dump == false) { 139 fibril_mutex_unlock(&dumper->mutex); 140 return; 141 } 142 dumper->to_dump = false; 143 dumper->writer.ops->close(&dumper->writer); 144 dumper->writer.data = NULL; 145 fibril_mutex_unlock(&dumper->mutex); 88 146 } 89 147 90 148 /** Initialize interface for dumping packets 91 149 * 92 * @param ifaceDevice dumping interface150 * @param dumper Device dumping interface 93 151 * 94 152 */ 95 errno_t pcap_ iface_init(pcap_iface_t *iface)153 errno_t pcap_dumper_init(pcap_dumper_t *dumper) 96 154 { 97 iface->to_dump = false; 98 iface->add_packet = pcap_add_packet; 99 iface->init = pcap_init; 100 iface->fini = pcap_close_file; 101 155 fibril_mutex_initialize(&dumper->mutex); 156 dumper->to_dump = false; 157 dumper->writer.ops = &file_ops; 102 158 return EOK; 103 159 } -
uspace/lib/pcap/src/pcapctl_dump.c
r59fe16d r03cd7a9e 151 151 printf("number: %d\n", *index); 152 152 if (*index == -1) { 153 154 rc = loc_service_get_id("net/eth1", &svc, 0); 155 if (rc != EOK) 156 { 157 fprintf(stderr, "Error getting service id.\n"); 158 return ENOENT; 159 } 160 } 161 else { 162 rc = pcapctl_cat_get_svc(index, &svc); 163 if (rc != EOK) { 164 printf("Error finding the device with index: %d\n", *index); 165 goto error; 166 } 153 *index = 0; 154 } 155 156 rc = pcapctl_cat_get_svc(index, &svc); 157 if (rc != EOK) { 158 printf("Error finding the device with index: %d\n", *index); 159 goto error; 167 160 } 168 161 … … 206 199 aid_t req = async_send_0(exch, PCAP_CONTROL_SET_START, NULL); 207 200 208 rc = async_data_write_start(exch, (const void *) 201 rc = async_data_write_start(exch, (const void *)name, size); 209 202 210 203 pcapctl_dump_exchange_end(exch); -
uspace/lib/pcap/src/pcapdump_iface.c
r59fe16d r03cd7a9e 38 38 #include <async.h> 39 39 #include <errno.h> 40 #include <stdlib.h> 40 41 #include <fibril_synch.h> 42 #include <str.h> 41 43 42 44 #include "pcapdump_iface.h" 43 45 44 FIBRIL_MUTEX_INITIALIZE(to_dump_mutex); 45 46 static void pcapdump_start_srv(ipc_call_t *icall, pcap_iface_t *iface) 46 static void pcapdump_start_srv(ipc_call_t *icall, pcap_dumper_t *dumper) 47 47 { 48 48 char *data; 49 49 size_t size; 50 errno_t rc = async_data_write_accept((void **) &data, false, 0, 0, 0, &size);50 errno_t rc = async_data_write_accept((void **) &data, true, 0, 0, 0, &size); 51 51 if (rc != EOK) { 52 52 async_answer_0(icall, rc); … … 54 54 } 55 55 56 /** When try to start when already started, close current and starts new */ 57 if (iface->to_dump == true) { 58 iface->fini(); 56 assert(str_length(data) == size && "Data were damaged during transmission.\n"); 57 58 rc = pcap_dumper_start(dumper, (const char *)data); 59 free(data); 60 if (rc != EOK) 61 { 62 //TODO what? 59 63 } 60 iface->init((const char *)data); 61 62 fibril_mutex_lock(&to_dump_mutex); 63 iface->to_dump = true; 64 fibril_mutex_unlock(&to_dump_mutex); 65 66 async_answer_0(icall, rc); 64 async_answer_0(icall, EOK); 67 65 } 68 66 69 static void pcapdump_stop_srv(ipc_call_t *icall, pcap_ iface_t *iface)67 static void pcapdump_stop_srv(ipc_call_t *icall, pcap_dumper_t *dumper) 70 68 { 71 /** If want to stop, when already stopped, do nothing */ 72 if (iface->to_dump == false) { 73 async_answer_0(icall, EOK); 74 return; 75 } 76 77 fibril_mutex_lock(&to_dump_mutex); 78 iface->to_dump = false; 79 fibril_mutex_unlock(&to_dump_mutex); 80 81 iface->fini(); 69 pcap_dumper_stop(dumper); 82 70 async_answer_0(icall, EOK); 83 71 } … … 85 73 void pcapdump_conn(ipc_call_t *icall, void *arg) 86 74 { 87 pcap_ iface_t *iface = (pcap_iface_t *)arg;88 printf("pcapdump_conn\n"); 89 assert(( iface != NULL) && "pcapdump requires pcap interface\n");75 pcap_dumper_t *dumper = (pcap_dumper_t *)arg; 76 77 assert((dumper != NULL) && "pcapdump requires pcap dumper\n"); 90 78 91 79 /* Accept connection */ … … 103 91 switch (method) { 104 92 case PCAP_CONTROL_SET_START: 105 pcapdump_start_srv(&call, iface);93 pcapdump_start_srv(&call, dumper); 106 94 break; 107 95 case PCAP_CONTROL_SET_STOP: 108 pcapdump_stop_srv(&call, iface);96 pcapdump_stop_srv(&call, dumper); 109 97 break; 110 98 default: … … 115 103 } 116 104 117 errno_t pcapdump_init(pcap_ iface_t *iface)105 errno_t pcapdump_init(pcap_dumper_t *dumper) 118 106 { 119 107 port_id_t port; 120 108 errno_t rc; 121 109 122 rc = pcap_ iface_init(iface);110 rc = pcap_dumper_init(dumper); 123 111 124 112 if (rc != EOK) { … … 128 116 129 117 rc = async_create_port(INTERFACE_PCAP_CONTROL, 130 pcapdump_conn, iface, &port);118 pcapdump_conn, dumper, &port); 131 119 if (rc != EOK) { 132 120 return rc; … … 139 127 * Called every time, the packet is sent/recieved by the device 140 128 * 141 * @param ifaceDumping interface129 * @param dumper Dumping interface 142 130 * @param data The packet 143 131 * @param size Size of the packet 144 132 * 145 133 */ 146 void pcapdump_packet(pcap_ iface_t *iface, const void *data, size_t size)134 void pcapdump_packet(pcap_dumper_t *dumper, const void *data, size_t size) 147 135 { 148 136 149 if ( iface== NULL) {137 if (dumper == NULL) { 150 138 return; 151 139 } 152 140 153 if (!iface->to_dump) { 154 return; 155 } 156 157 iface->add_packet(data, size); 141 pcap_dumper_add_packet(dumper, data, size); 158 142 } 159 143 -
uspace/srv/net/ethip/ethip.c
r59fe16d r03cd7a9e 55 55 #define NAME "ethip" 56 56 /** Interface for dumping packets */ 57 pcap_iface_t pcapdump;58 57 59 58 static errno_t ethip_open(iplink_srv_t *srv); … … 93 92 } 94 93 95 rc = pcapdump_init(&pcapdump);96 if (rc != EOK) {97 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed initializing dumping interface.");98 return rc;99 }100 94 101 95 rc = ethip_nic_discovery_start(); … … 206 200 if (rc != EOK) 207 201 return rc; 208 pcapdump_packet(&pcapdump, data, size);209 202 rc = ethip_nic_send(nic, data, size); 210 203 free(data); … … 251 244 return rc; 252 245 } 253 pcapdump_packet(&pcapdump, data, size);254 246 255 247 iplink_recv_sdu_t sdu;
Note:
See TracChangeset
for help on using the changeset viewer.