Diff for /libaitrpc/src/cli.c between versions 1.22 and 1.23

version 1.22, 2014/01/28 14:05:43 version 1.23, 2015/01/15 01:42:37
Line 282  rpc_cli_reconnectClient(rpc_cli_t * __restrict cli) Line 282  rpc_cli_reconnectClient(rpc_cli_t * __restrict cli)
 void  void
 rpc_cli_closeClient(rpc_cli_t ** __restrict cli)  rpc_cli_closeClient(rpc_cli_t ** __restrict cli)
 {  {
        if (!cli || !*cli)        if (!cli || !*cli || (*cli)->cli_id == SOCK_BPF)
                 return;                  return;
   
         if ((*cli)->cli_id == SOCK_STREAM)          if ((*cli)->cli_id == SOCK_STREAM)
Line 350  rpc_pkt_Receive(int sock, int type, sockaddr_t * __res Line 350  rpc_pkt_Receive(int sock, int type, sockaddr_t * __res
         do {          do {
                 if (type == SOCK_STREAM)                  if (type == SOCK_STREAM)
                         ret = rpc_Read(sock, type, !estlen ? MSG_PEEK : 0, NULL, buf, blen);                          ret = rpc_Read(sock, type, !estlen ? MSG_PEEK : 0, NULL, buf, blen);
                else                else if (type == SOCK_BPF) {
                         ret = rpc_Read(sock, type, 0, sa, AIT_GET_BUF(pkt), AIT_LEN(pkt));
                         if (ret > 0)
                                 estlen = ret;
                  } else
                         ret = rpc_Read(sock, type, !estlen ? MSG_PEEK : 0, sa, buf, blen);                          ret = rpc_Read(sock, type, !estlen ? MSG_PEEK : 0, sa, buf, blen);
                 if (ret < 1)                  if (ret < 1)
                         return ret;                          return ret;
Line 454  rpc_pkt_Request(ait_val_t * __restrict pkt, rpc_sess_t Line 458  rpc_pkt_Request(ait_val_t * __restrict pkt, rpc_sess_t
  * rpc_pkt_Replay() - Decode RPC Replay packet   * rpc_pkt_Replay() - Decode RPC Replay packet
  *   *
  * @pkt = Packet buffer   * @pkt = Packet buffer
 * @sess = RPC session info * @sess = RPC session info, if =NULL don't check session
  * @tag = Function tag   * @tag = Function tag
  * @vars = Function argument array of values, may be NULL   * @vars = Function argument array of values, may be NULL
  * @nocrc = Without CRC calculation   * @nocrc = Without CRC calculation
Line 469  rpc_pkt_Replay(ait_val_t * __restrict pkt, rpc_sess_t  Line 473  rpc_pkt_Replay(ait_val_t * __restrict pkt, rpc_sess_t 
         u_char *buf;          u_char *buf;
         uint16_t crc;          uint16_t crc;
   
        if (!pkt || !sess) {        if (!pkt) {
                 rpc_SetErr(EINVAL, "Invalid argument(s)!");                  rpc_SetErr(EINVAL, "Invalid argument(s)!");
                 return -1;                  return -1;
         } else          } else
Line 487  rpc_pkt_Replay(ait_val_t * __restrict pkt, rpc_sess_t  Line 491  rpc_pkt_Replay(ait_val_t * __restrict pkt, rpc_sess_t 
         }          }
   
         /* check RPC packet session info */          /* check RPC packet session info */
        if (rpc_chkPktSession(&rpc->call_session, sess)) {        if (sess && rpc_chkPktSession(&rpc->call_session, sess)) {
                 rpc_SetErr(ERPCMISMATCH, "Get invalid RPC session");                  rpc_SetErr(ERPCMISMATCH, "Get invalid RPC session");
                 return -1;                  return -1;
         }          }
Line 617  rpc_cli_ping(rpc_cli_t *cli) Line 621  rpc_cli_ping(rpc_cli_t *cli)
         rpc_cli_freeCall(&arr);          rpc_cli_freeCall(&arr);
   
         return ret;          return ret;
   }
   
   
   /*
    * rpc_cli_openClient2() - Connect to layer2 RPC Server
    *
    * @InstID = InstID for RPC session request
    * @netBuf = Network buffer length (min:512 bytes), if =0 == BUFSIZ (also meaning max RPC packet)
    * @csIface = Interface name for bind client, if NULL first interface on host
    * @csHost = Host ethernet address
    * return: NULL == error or !=NULL connection to RPC server established
    */
   rpc_cli_t *
   rpc_cli_openClient2(u_char InstID, int netBuf, const char *csIface, const char *csHost)
   {
           rpc_cli_t *cli = NULL;
           sockaddr_t sa = E_SOCKADDR_INIT, sal = E_SOCKADDR_INIT;
           char szIface[64], szStr[STRSIZ];
           register int i;
           struct ifreq ifr;
           int n = 1;
           struct bpf_insn insns[] = {
                   BPF_STMT(BPF_LD + BPF_H + BPF_ABS, 12),
                   BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, RPC_DEFPORT, 0, 1),
                   BPF_STMT(BPF_RET + BPF_K, -1),
                   BPF_STMT(BPF_RET + BPF_K, 0),
           };
           struct bpf_program fcode = { 
                   .bf_len = sizeof(insns) / sizeof(struct bpf_insn), 
                   .bf_insns = insns
           };
   
           if (!csHost || !e_getlinkbyname(csHost, &sa))
                   return NULL;
           if (!csIface) {
                   if (e_get1stiface(szIface, sizeof szIface))
                           return NULL;
           } else
                   strlcpy(szIface, csIface, sizeof szIface);
           if (!e_getifacebyname(szIface, &sal))
                   return NULL;
   
           cli = e_malloc(sizeof(rpc_cli_t));
           if (!cli) {
                   LOGERR;
                   return NULL;
           } else
                   memset(cli, 0, sizeof(rpc_cli_t));
   
           /* build session */
           cli->cli_parent = e_malloc(sizeof(rpc_sess_t));
           if (!cli->cli_parent) {
                   LOGERR;
                   e_free(cli);
                   return NULL;
           } else {
                   ((rpc_sess_t*) cli->cli_parent)->sess_version = RPC_VERSION;
                   ((rpc_sess_t*) cli->cli_parent)->sess_instance = InstID;
           }
   
           cli->cli_id = SOCK_BPF;
           memcpy(&cli->cli_sa, &sa, sizeof cli->cli_sa);
   
           /* connect to RPC server */
           for (i = 0; i < 10; i++) {
                   memset(szStr, 0, sizeof szStr);
                   snprintf(szStr, sizeof szStr, "/dev/bpf%d", i);
                   cli->cli_sock = open(szStr, O_RDWR);
                   if (cli->cli_sock > STDERR_FILENO)
                           break;
           }
           if (cli->cli_sock < 3) {
                   LOGERR;
                   e_free(cli->cli_parent);
                   e_free(cli);
                   return NULL;
           }
   
           if (ioctl(cli->cli_sock, BIOCIMMEDIATE, &n) == -1) {
                   LOGERR;
                   goto err;
           }
           if (ioctl(cli->cli_sock, BIOCSETF, &fcode) == -1) {
                   LOGERR;
                   goto err;
           }
           n = (netBuf < RPC_MIN_BUFSIZ) ? getpagesize() : E_ALIGN(netBuf, 2);
           if (ioctl(cli->cli_sock, BIOCSBLEN, &n) == -1) {
                   LOGERR;
                   goto err;
           } else
                   AIT_SET_BUFSIZ(&cli->cli_buf, 0, n);
   
           memset(&ifr, 0, sizeof ifr);
           strlcpy(ifr.ifr_name, szIface, sizeof ifr.ifr_name);
           if (ioctl(cli->cli_sock, BIOCSETIF, &ifr) == -1) {
                   LOGERR;
                   goto err;
           } else
                   fcntl(cli->cli_sock, F_SETFL, 
                                   fcntl(cli->cli_sock, F_GETFL) | O_NONBLOCK);
   
           return cli;
   err:
           AIT_FREE_VAL(&cli->cli_buf);
           if (cli->cli_sock > 2)
                   close(cli->cli_sock);
           e_free(cli->cli_parent);
           e_free(cli);
           return NULL;
   }
   
   /*
    * rpc_cli_closeClient2() - Close layer2 connection to RPC server and free resources
    *
    * @cli = RPC Client session
    * return: none
    */
   void
   rpc_cli_closeClient2(rpc_cli_t ** __restrict cli)
   {
           if (!cli || !*cli || (*cli)->cli_id != SOCK_BPF)
                   return;
   
           close((*cli)->cli_sock);
   
           AIT_FREE_VAL(&(*cli)->cli_buf);
   
           if ((*cli)->cli_parent)
                   e_free((*cli)->cli_parent);
   
           e_free(*cli);
           *cli = NULL;
 }  }

Removed from v.1.22  
changed lines
  Added in v.1.23


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>