Especifics Ioctl

O driver dlpi suporta as operações do ioctl.

O driver dlpi suporta as seguintes operações do ioctl:

  • DL_ROUTE
  • DL_TUNE_LLC
  • DL_ZERO_STATS
  • DL_SET_REMADDR

Estes comandos e suas estruturas de dados associadas estão descritos no arquivo de cabeçalho /usr/include/sys/dlpi_aix.h .

Nota: Os comandos do ioctl que requerem um argumento mais longo do que uma palavra longa, ou que especificam um ponteiro para leitura ou escrita, devem utilizar o formato I_STR , como no exemplo a seguir:

int
istr(int fd, int cmd, char *data, int len) {
       struct strioctl  ic;
       ic.cmd = cmd;
       ic.timout = -1;
       ic.dp = data;
       ic.dp = data;
       ic.len = len;
       return ioctl(fd, I_STR, &ic);
}
Item Descrição
DL_ROUTE Desabilita o roteamento de origem no fluxo atual, consulta o Dynamic Route Discovery para uma rota de origem, ou estaticamente designa uma rota de origem para este fluxo. Ele só é aceito quando o fluxo é ocioso (DL_IDLE).
  • Se o comprimento do argumento for 0, nenhuma rota de origem é usada em quadros de saída.
  • Se o comprimento do argumento for igual ao comprimento do endereço MAC para o meio atual (por exemplo, 6 para a maioria dos provedores 802.x ), o algoritmo DRD é usado para obter a rota de origem para o endereço especificado no argumento. O endereço MAC é substituído com a rota de origem no retorno do ioctl.
  • Caso contrário, o argumento é assumido para conter um endereço do formuláriomac_addr.source_route, e osource_routeporção é usada como rota de origem para este fluxo em todas as comunicações.
Como exemplo, o código a seguir pode ser usado para descobrir a rota de origem para um endereço arbitrário:

char *
getroute(int fd, char *addr, int len) {
        static char route[MAXROUTE_LEN];
        bcopy(addr, route, len);
        if (istr(fd, DL_ROUTE, route, len))
                return 0;
        return route;
}
DL_TUNE_LLC Permite que o usuário do DLS altere os parâmetros ajustáveis LLC padrão. O argumento deve apontar para uma estrutura de dados llctune_t .

O campo de bandeiras é examinado para determinar quais, se houver, os parâmetros devem ser alterados. Cada bit no campo flags corresponde a um campo nomeado similarmente no llctune_t; se o bit for configurado, o parâmetro correspondente será definido para o valor em llctune_t. Apenas o fluxo atual é afetado, e as mudanças são descartadas quando o fluxo é fechado.

Se a sinalização F_LLC_SET for definida e o usuário possuir autoridade root, os parâmetros alterados serão salvos como os novos parâmetros padrão para todos os novos fluxos.

Este comando retorna como seu argumento uma atualização dos parâmetros ajustáveis atuais.

Por exemplo, para dobrar at1valor, o código a seguir pode ser usado:

int
more_t1(int fd) {
        llctune_t t;
        t.flags = 0;
        if (istr(fd, DL_TUNE_LLC, &t, sizeof(t)))
           return -1;
        t.flags = F_LLC_T1;
        t.t1 *= 2;
        return istr(fd, DL_TUNE_LLC, &t, sizeof(t));
}

Para consultar os ajustáveis, emita DL_TUNE_LLC com o campo de bandeiras configurado como zero. Isso não alterará nenhum parâmetro e retornará os valores ajustáveis atuais.

DL_ZERO_STATS Redefine os contadores de estatísticas a zero. O motorista mantém dois conjuntos independentes de estatísticas, um para cada fluxo (local), e outro que é a estatística cumulativa para todos os fluxos (global).

Este comando aceita um argumento booleano simples. Se o argumento for True (nonzero), as estatísticas globais são zeradas. Caso contrário, apenas as estatísticas do fluxo atual são zeradas.

Por exemplo, para zerar os contadores de estatísticas sobre o fluxo atual, pode ser usado o seguinte código:

int
zero_stats(int fd) {
        return ioctl(fd, DL_ZERO_STATS, 0);
}
DL_SET_REMADDR Permite a troca de XID/TEST em fluxos orientados a conexão enquanto ainda no estado DL_IDLE .

O driver dlpi utiliza tanto o endereço de origem (remoto) quanto o dl_sap para determinar onde rotear mensagens recebidas para fluxos orientados a conexão. O endereço remoto é ordinariamente especificado em DL_CONNECT_REQ. Se o usuário do DLS precisar trocar mensagens XID ou TEST antes de conectar-se à estação remota, DL_SET_REMADDR deve ser usado.

Nota: Observe que este comando é not necessário se as mensagens XID e TEST devem ser trocadas apenas quando o estado for DL_DATAXFER.
O argumento para este comando é o endereço MAC remoto. Um possível fragmento de código pode ser:

int
setaddr(int fd, char *addr, int len) {
        return istr(fd, DL_SET_REMADDR, addr, len);
}