DPDK - CLI 명령 행 모듈

17539 단어 DPDK
목차
글 목록
  • 목록
  • DPDK CLI
  • 명령 행 초기 화
  • 명령 행 해석
  • 명령 행 의 인자
  • 명령 행 의 기능
  • 참고 문서
  • DPDK CLI
    DPDK App 을 개발 할 때 DPDK 가 제공 하 는 CLI 도 구 를 이용 하여 프로그램 에 명령 행 을 추가 할 수 있 습 니 다.네 부분 으로 구 성 된 명령 을 추가 합 니 다:
  • 명령 행 초기 화
  • 명령 행 해석
  • 명령 행 매개 변수의 데이터 구조
  • 명령 행 의 기능 실현 함수
  • / opt / dpdk - 18.08 / examples / cmdline 에서 완전한 Demo 를 제공 하여 참고 할 수 있 고 이 를 바탕 으로 EXAMPLE 를 확장 할 수 있 습 니 다.아래 의 코드 는 모두 이 예시 에서 나온다.
    명령 줄 초기 화
    명령 행 을 초기 화 합 니 다. 명령 행 기능 은 cmd 입 니 다.obj_add_parsed, 명령 행 의 형식 은 tokens 입 니 다.
    cmdline_parse_inst_t cmd_obj_add = {
         
    	.f = cmd_obj_add_parsed, 	 /* function to call */
    	.data = NULL,     			 /* 2nd arg of func */
    	.help_str = "Add an object (name, val)",
    	.tokens = {
                                        /* token   , NULL    */
    		(void *)&cmd_obj_action_add,
    		(void *)&cmd_obj_name,
    		(void *)&cmd_obj_ip,
    		NULL,
    	},
    };
    

    그리고 초기 화 된 명령 줄 을 명령 줄 을 저장 하 는 배열 에 추가 합 니 다. 이 배열 은 모든 명령 줄 의 인 스 턴 스 (정의, 해석 및 기능 포함) 를 저장 하여 NULL 로 끝 냅 니 다.
    /* CONTEXT (list of instruction */
    cmdline_parse_ctx_t main_ctx[] = {
         
    	(cmdline_parse_inst_t *)&cmd_obj_add,
    	NULL,
    };
    

    마지막 으로 mian 함수 에서 명령 행 대상 을 만 들 고 콘 솔 과 사용자 의 상호작용 을 통 해 다음 과 같이 구체 적 으로 실현 합 니 다.
    // dpdk-18.08/examples/cmdline/main.c
    
    
    /* SPDX-License-Identifier: BSD-3-Clause
     * Copyright(c) 2010-2014 Intel Corporation.
     * Copyright (c) 2009, Olivier MATZ 
     * All rights reserved.
     */
    
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    #include 
    #include 
    #include 
    #include 
    
    #include 
    #include 
    #include 
    
    #include "commands.h"
    
    int main(int argc, char **argv)
    {
         
    	int ret;
    	struct cmdline *cl;
    
    	ret = rte_eal_init(argc, argv);
    	if (ret < 0)
    		rte_panic("Cannot init EAL
    "
    ); cl = cmdline_stdin_new(main_ctx, "example> "); if (cl == NULL) rte_panic("Cannot create cmdline instance
    "
    ); cmdline_interact(cl); cmdline_stdin_exit(cl); return 0; }

    명령 행 해석
    cmdline_parse_token_string_t cmd_obj_action_add =
    	TOKEN_STRING_INITIALIZER(struct cmd_obj_add_result, action, "add");
    cmdline_parse_token_string_t cmd_obj_name =
    	TOKEN_STRING_INITIALIZER(struct cmd_obj_add_result, name, NULL);
    cmdline_parse_token_ipaddr_t cmd_obj_ip =
    	TOKEN_IPADDR_INITIALIZER(struct cmd_obj_add_result, ip);
    

    명령 행 인자
    이 구조 체 는 명령 행 의 매개 변수 목록 을 저장 하 는 데 사 용 됩 니 다:
    struct cmd_obj_add_result {
                         
    	cmdline_fixed_string_t action;
    	cmdline_fixed_string_t name;
    	cmdline_ipaddr_t ip;
    };
    

    명령 행 기능
    어떤 명령 을 실행 하여 구체 적 으로 완 성 된 기능:
    static void cmd_obj_add_parsed(void *parsed_result,struct cmdline *cl, __attribute__((unused)) void *data)
    {
         
    	struct cmd_obj_add_result *res = parsed_result;   //            ;
    	struct object *o;
    	char ip_str[INET6_ADDRSTRLEN];
     
    	SLIST_FOREACH(o, &global_obj_list, next) {
         
    		if (!strcmp(res->name, o->name)) {
         
    			cmdline_printf(cl, "Object %s already exist
    "
    , res->name); return; } break; } o = malloc(sizeof(*o)); if (!o) { cmdline_printf(cl, "mem error
    "
    ); return; } snprintf(o->name, sizeof(o->name), "%s", res->name); o->ip = res->ip; SLIST_INSERT_HEAD(&global_obj_list, o, next); if (o->ip.family == AF_INET) snprintf(ip_str, sizeof(ip_str), NIPQUAD_FMT, NIPQUAD(o->ip.addr.ipv4)); else snprintf(ip_str, sizeof(ip_str), NIP6_FMT, NIP6(o->ip.addr.ipv6)); cmdline_printf(cl, "Object %s added, ip=%s
    "
    , o->name, ip_str); }

    참고 문서
    https://blog.csdn.net/zhang1051546117/article/details/78051240

    좋은 웹페이지 즐겨찾기