Changeset 1d14090 in mainline


Ignore:
Timestamp:
2024-12-13T08:44:05Z (10 months ago)
Author:
Nataliia Korop <n.corop08@…>
Children:
64ea525
Parents:
f08447b
git-author:
Nataliia Korop <n.corop08@…> (2024-11-10 09:08:41)
git-committer:
Nataliia Korop <n.corop08@…> (2024-12-13 08:44:05)
Message:

dumper ops can be set by user

Location:
uspace
Files:
10 edited
2 moved

Legend:

Unmodified
Added
Removed
  • uspace/app/pcapctl/main.c

    rf08447b r1d14090  
    5252        }
    5353
    54         pcapctl_dump_start(name, sess);
     54        rc = pcapctl_dump_start(name, sess);
     55        if (rc != EOK)
     56        {
     57                printf("Starting the dumping was not successful.\n");
     58        }
    5559        pcapctl_dump_close(sess);
    5660        return EOK;
     
    6468                return 1;
    6569        }
    66         pcapctl_dump_stop(sess);
     70        rc = pcapctl_dump_stop(sess);
     71        if (rc != EOK)
     72        {
     73                printf("Stoping the dumping was not successful.\n");
     74        }
     75        pcapctl_dump_close(sess);
     76        return EOK;
     77}
     78
     79static errno_t set_dumper_ops(int *dev_number, const char *name)
     80{
     81        pcapctl_sess_t *sess = NULL;
     82        errno_t rc = pcapctl_dump_open(dev_number, &sess);
     83        if (rc != EOK)
     84        {
     85                return rc;
     86        }
     87
     88        rc = pcapctl_dump_set_ops(name, sess);
     89        if (rc != EOK)
     90        {
     91                printf("Setting dumper ops was not successful.\n");
     92        }
    6793        pcapctl_dump_close(sess);
    6894        return EOK;
     
    84110        { "start", no_argument, 0, 'r' },
    85111        { "stop", no_argument, 0, 't' },
     112        { "ops", required_argument, 0, 'o' },
    86113        { 0, 0, 0, 0 }
    87114};
     
    106133        bool start = false;
    107134        bool stop = false;
     135        bool set_ops = false;
    108136        int dev_number = -1;
    109137        const char *output_file_name = "";
     138        const char *ops_name = "";
    110139        int idx = 0;
    111140        int ret = 0;
     
    142171                        stop = true;
    143172                        break;
     173                case 'o':
     174                        set_ops = true;
     175                        ops_name = optarg;
     176                        break;
    144177                }
    145178        }
     
    154187                stop_dumping(&dev_number);
    155188        }
     189        else if (set_ops)
     190        {
     191                set_dumper_ops(&dev_number, ops_name);
     192        }
    156193        return 0;
    157194}
  • uspace/lib/nic/include/nic.h

    rf08447b r1d14090  
    4444#include <device/hw_res_parsed.h>
    4545#include <ops/nic.h>
    46 #include <pcap_iface.h>
     46#include <pcap_dumper.h>
    4747
    4848#define DEVICE_CATEGORY_NIC "nic"
  • uspace/lib/nic/src/nic_driver.c

    rf08447b r1d14090  
    562562                fibril_rwlock_write_unlock(&nic_data->stats_lock);
    563563        }
    564         pcapdump_packet(nic_get_pcap_iface(nic_data), frame->data, frame->size);
     564        //pcapdump_packet(nic_get_pcap_iface(nic_data), frame->data, frame->size);
    565565        nic_release_frame(nic_data, frame);
    566566}
  • uspace/lib/nic/src/nic_impl.c

    rf08447b r1d14090  
    180180                return EBUSY;
    181181        }
    182         //pcapdump_packet(nic_get_pcap_iface(nic_data), data, size);
     182        pcapdump_packet(nic_get_pcap_iface(nic_data), data, size);
    183183        nic_data->send_frame(nic_data, data, size);
    184184        fibril_rwlock_read_unlock(&nic_data->main_lock);
  • uspace/lib/pcap/include/pcap_dumper.h

    rf08447b r1d14090  
    4848extern void pcap_dumper_stop(struct pcap_dumper *);
    4949extern errno_t pcap_dumper_init(pcap_dumper_t *);
    50 
    51 // v ramci init jeste linktype prg
    52 //set snaplen taky lze pridavat prg
    53 
     50extern errno_t pcap_dumper_set_ops(struct pcap_dumper *, const char *);
    5451extern errno_t pcap_dumper_start(struct pcap_dumper *, const char *);
    5552extern void pcap_dumper_add_packet(struct pcap_dumper *, const void *data, size_t size);
  • uspace/lib/pcap/include/pcapctl_dump.h

    rf08447b r1d14090  
    4949} pcapctl_sess_t;
    5050
    51 extern errno_t pcapctl_dump_open(int *, pcapctl_sess_t **rsess);
    52 extern errno_t pcapctl_dump_close(pcapctl_sess_t *sess);
     51extern errno_t pcapctl_dump_open(int *, pcapctl_sess_t **);
     52extern errno_t pcapctl_dump_close(pcapctl_sess_t *);
    5353extern errno_t pcapctl_dump_start(const char *, pcapctl_sess_t *);
     54extern errno_t pcapctl_dump_set_ops(const char *, pcapctl_sess_t *);
    5455extern errno_t pcapctl_dump_stop(pcapctl_sess_t *);
    5556extern errno_t pcapctl_list(void);
  • uspace/lib/pcap/include/pcapdump_iface.h

    rf08447b r1d14090  
    4040
    4141#include <errno.h>
    42 #include "pcap_iface.h"
     42#include "pcap_dumper.h"
    4343
    4444typedef enum {
    4545        PCAP_CONTROL_SET_START = IPC_FIRST_USER_METHOD,
    4646        PCAP_CONTROL_SET_STOP,
    47         PCAP_CONTROL_GET_NAME
     47        PCAP_CONTROL_GET_NAME,
     48        PCAP_CONTROL_SET_OPS,
    4849} pcap_request_t;
    4950
  • uspace/lib/pcap/meson.build

    rf08447b r1d14090  
    2929src = files(
    3030    'src/pcap.c',
    31     'src/pcap_iface.c',
     31    'src/pcap_dumper.c',
    3232    'src/pcapdump_iface.c',
    3333    'src/pcapctl_dump.c',
  • uspace/lib/pcap/src/pcap.c

    rf08447b r1d14090  
    7272void pcap_writer_add_packet(pcap_writer_t *writer, const void *captured_packet, size_t size)
    7373{
    74         if (!writer->data)
    75                 return;
     74
    7675        pcap_packet_header_t pcap_packet;
    7776        pcap_set_time(&pcap_packet);
  • uspace/lib/pcap/src/pcap_dumper.c

    rf08447b r1d14090  
    3535
    3636#include <errno.h>
    37 #include "pcap_iface.h"
     37#include <str.h>
     38#include "pcap_dumper.h"
    3839
    3940static size_t pcap_file_w32(pcap_writer_t *writer, uint32_t data)
     
    4950static size_t pcap_file_wbuffer(pcap_writer_t *writer, const void *data, size_t size)
    5051{
     52        assert(writer->data);
    5153        return fwrite(data, 1, size, (FILE *)writer->data);
    5254}
     
    5557{
    5658        fclose((FILE *)writer->data);
     59        writer->data = NULL;
    5760}
    5861
     
    6568};
    6669
    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 // }
     70static size_t pcap_short_file_w32(pcap_writer_t *writer, uint32_t data)
     71{
     72        return fwrite(&data, 1, 4, (FILE *)writer->data);
     73}
    7174
    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 // }
     75static size_t pcap_short_file_w16(pcap_writer_t *writer, uint16_t data)
     76{
     77        return fwrite(&data, 1, 2, (FILE *)writer->data);
     78}
    7679
    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 // }
     80static size_t pcap_short_file_wbuffer(pcap_writer_t *writer, const void *data, size_t size)
     81{
     82        return fwrite(data, 1, size<60?size:60, (FILE *)writer->data);
     83}
    8184
    82 // static void pcap_short_file_close(pcap_writer_t *writer)
    83 // {
    84 //      fclose((FILE *)writer->data);
    85 // }
     85static void pcap_short_file_close(pcap_writer_t *writer)
     86{
     87        fclose((FILE *)writer->data);
     88}
    8689
    87 // static pcap_writer_ops_t short_file_ops = {
    88 //      .write_u32 = &pcap_short_file_w32,
    89 //      .write_u16 = &pcap_short_file_w16,
    90 //      .write_buffer = &pcap_short_file_wbuffer,
    91 //      .close = &pcap_short_file_close
     90static pcap_writer_ops_t short_file_ops = {
     91        .write_u32 = &pcap_short_file_w32,
     92        .write_u16 = &pcap_short_file_w16,
     93        .write_buffer = &pcap_short_file_wbuffer,
     94        .close = &pcap_short_file_close
    9295
    93 // };
     96};
    9497
    9598errno_t pcap_dumper_start(struct pcap_dumper *dumper, const char *name)
     
    98101
    99102        /** When try to start when already started, close current and starts new */
    100         if (dumper->to_dump == true) {
     103        if (dumper->to_dump) {
    101104                pcap_dumper_stop(dumper);
    102105        }
     
    111114}
    112115
    113 //udelat globalni
     116errno_t pcap_dumper_set_ops(struct pcap_dumper *dumper, const char *name)
     117{
     118        fibril_mutex_lock(&dumper->mutex);
     119        errno_t rc = EOK;
     120        if (!str_cmp(name, "short_file"))
     121        {
     122                dumper->writer.ops = &short_file_ops;
     123        }
     124        else if (!str_cmp(name, "full_file"))
     125        {
     126                dumper->writer.ops = &file_ops;
     127        }
     128        else
     129        {
     130                rc = EINVAL;
     131        }
     132        fibril_mutex_unlock(&dumper->mutex);
     133        return rc;
     134}
     135
     136
    114137void pcap_dumper_add_packet(struct pcap_dumper *dumper, const void *data, size_t size)
    115138{
    116139        fibril_mutex_lock(&dumper->mutex);
    117140
    118         if (dumper->writer.data == NULL || !dumper->to_dump) {
     141        if (!dumper->to_dump) {
    119142                fibril_mutex_unlock(&dumper->mutex);
    120143                return;
    121144        }
     145
    122146        pcap_writer_add_packet(&dumper->writer, data, size);
    123147        fibril_mutex_unlock(&dumper->mutex);
    124148}
    125149
    126 //udelt globalni
    127150void pcap_dumper_stop(struct pcap_dumper *dumper)
    128151{
     
    130153
    131154        /** If want to stop, when already stopped, do nothing */
    132         if (dumper->to_dump == false) {
     155        if (!dumper->to_dump) {
    133156                fibril_mutex_unlock(&dumper->mutex);
    134157                return;
     
    136159        dumper->to_dump = false;
    137160        dumper->writer.ops->close(&dumper->writer);
    138         dumper->writer.data = NULL;
    139161        fibril_mutex_unlock(&dumper->mutex);
    140162}
     
    149171        fibril_mutex_initialize(&dumper->mutex);
    150172        dumper->to_dump = false;
    151         dumper->writer.ops = &file_ops;
     173        dumper->writer.ops = NULL;
    152174        return EOK;
    153175}
  • uspace/lib/pcap/src/pcapctl_dump.c

    rf08447b r1d14090  
    198198        aid_t req = async_send_0(exch, PCAP_CONTROL_SET_START, NULL);
    199199
    200         rc = async_data_write_start(exch, (const void *)name, size);
     200        rc = async_data_write_start(exch, name, size);
    201201
    202202        pcapctl_dump_exchange_end(exch);
     
    227227}
    228228
     229errno_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
    229251/** @}
    230252 */
  • uspace/lib/pcap/src/pcapdump_iface.c

    rf08447b r1d14090  
    7070}
    7171
     72static void pcapdump_set_ops_srv(ipc_call_t *icall, pcap_dumper_t *dumper)
     73{
     74        char *data;
     75        size_t size;
     76        errno_t rc = async_data_write_accept((void **) &data, true, 0, 0, 0, &size);
     77        if (rc != EOK) {
     78                async_answer_0(icall, rc);
     79                return;
     80        }
     81
     82        assert(str_length(data) == size && "Data were damaged during transmission.\n");
     83
     84        rc = pcap_dumper_set_ops(dumper, (const char *)data);
     85        free(data);
     86        if (rc != EOK) {
     87                //TODO what?
     88        }
     89        async_answer_0(icall, EOK);
     90
     91}
     92
    7293void pcapdump_conn(ipc_call_t *icall, void *arg)
    7394{
     
    94115                case PCAP_CONTROL_SET_STOP:
    95116                        pcapdump_stop_srv(&call, dumper);
     117                        break;
     118                case PCAP_CONTROL_SET_OPS:
     119                        pcapdump_set_ops_srv(&call, dumper);
    96120                        break;
    97121                default:
Note: See TracChangeset for help on using the changeset viewer.